You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/04/29 23:03:34 UTC
svn commit: r1477340 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RuntimeExceptionMapper.java
Author: sergeyb
Date: Mon Apr 29 21:03:33 2013
New Revision: 1477340
URL: http://svn.apache.org/r1477340
Log:
[CXF-4988] Using MBW's produces if response content type had a wildcard, checking provider interfaces during the application setup
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RuntimeExceptionMapper.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1477340&r1=1477339&r2=1477340&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Mon Apr 29 21:03:33 2013
@@ -34,6 +34,7 @@ import java.util.logging.Logger;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.InternalServerErrorException;
+import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
@@ -121,6 +122,11 @@ public class JAXRSOutInterceptor extends
Response response = null;
if (responseObj instanceof Response) {
response = (Response)responseObj;
+ if (response.getStatus() == 500
+ && message.getExchange().get(JAXRSUtils.EXCEPTION_FROM_MAPPER) != null) {
+ message.put(Message.RESPONSE_CODE, 500);
+ return;
+ }
} else {
int status = getStatus(message, responseObj != null ? 200 : 204);
response = Response.status(status).entity(responseObj).build();
@@ -241,7 +247,14 @@ public class JAXRSOutInterceptor extends
List<WriterInterceptor> writers = providerFactory
.createMessageBodyWriterInterceptor(targetType, genericType, annotations, responseMediaType, message);
- responseMediaType = checkFinalContentType(responseMediaType);
+ OutputStream outOriginal = message.getContent(OutputStream.class);
+ if (writers == null || writers.isEmpty()) {
+ message.put(Message.CONTENT_TYPE, "text/plain");
+ message.put(Message.RESPONSE_CODE, 500);
+ writeResponseErrorMessage(outOriginal, "NO_MSG_WRITER", targetType.getSimpleName());
+ return;
+ }
+ responseMediaType = checkFinalContentType(responseMediaType, writers);
String finalResponseContentType = JAXRSUtils.mediaTypeToString(responseMediaType);
if (LOG.isLoggable(Level.FINE)) {
LOG.fine("Response content type is: " + finalResponseContentType);
@@ -249,15 +262,7 @@ public class JAXRSOutInterceptor extends
responseHeaders.putSingle(HttpHeaders.CONTENT_TYPE, finalResponseContentType);
message.put(Message.CONTENT_TYPE, finalResponseContentType);
- OutputStream outOriginal = message.getContent(OutputStream.class);
- if (writers == null) {
- message.put(Message.CONTENT_TYPE, "text/plain");
- message.put(Message.RESPONSE_CODE, 500);
- writeResponseErrorMessage(outOriginal, "NO_MSG_WRITER", targetType.getSimpleName());
- return;
- }
boolean enabled = checkBufferingMode(message, writers, firstTry);
-
try {
try {
@@ -390,13 +395,23 @@ public class JAXRSOutInterceptor extends
}
- private MediaType checkFinalContentType(MediaType mt) {
- if (mt.isWildcardType() || mt.isWildcardSubtype() && mt.getType().equals("application")) {
- return MediaType.APPLICATION_OCTET_STREAM_TYPE;
- } else {
- return mt;
+ private MediaType checkFinalContentType(MediaType mt, List<WriterInterceptor> writers) {
+ if (mt.isWildcardType() || mt.isWildcardSubtype()) {
+ int mbwIndex = writers.size() == 1 ? 0 : writers.size() - 1;
+ MessageBodyWriter<Object> writer = ((WriterInterceptorMBW)writers.get(mbwIndex)).getMBW();
+ Produces pm = writer.getClass().getAnnotation(Produces.class);
+ if (pm != null) {
+ List<MediaType> sorted =
+ JAXRSUtils.sortMediaTypes(JAXRSUtils.getMediaTypes(pm.value()), JAXRSUtils.MEDIA_TYPE_QS_PARAM);
+ mt = JAXRSUtils.intersectMimeTypes(sorted, mt).get(0);
+ if (mt.isWildcardType() || mt.isWildcardSubtype()) {
+ return MediaType.APPLICATION_OCTET_STREAM_TYPE;
+ }
+ } else {
+ return MediaType.APPLICATION_OCTET_STREAM_TYPE;
+ }
}
-
+ return mt;
}
private void setResponseDate(MultivaluedMap<String, Object> headers, boolean firstTry) {
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RuntimeExceptionMapper.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RuntimeExceptionMapper.java?rev=1477340&r1=1477339&r2=1477340&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RuntimeExceptionMapper.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/RuntimeExceptionMapper.java Mon Apr 29 21:03:33 2013
@@ -22,9 +22,7 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.ExceptionMapper;
-import javax.ws.rs.ext.Provider;
-@Provider
public class RuntimeExceptionMapper implements ExceptionMapper<RuntimeException> {
@Context