[ https://issues.apache.org/jira/browse/CXF-6368?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sergey Beryozkin resolved CXF-6368. ----------------------------------- Resolution: Fixed Fix Version/s: 3.0.5 3.1.0 Assignee: Sergey Beryozkin Thanks for the analysis, JAXRSDefaultFaultOutInterceptor is meant to support non-JAXRS (CXF-specific) interceptors that may throw the exceptions but users have registered JAX-RS Exception mappers. In this case it is interfering with the JAX-RS flow - so I've updated the code for this interceptor skip its processing in case of the unmapped second-time exceptions thrown from JAX-RS filters/interceptors > Unexpected response code > ------------------------ > > Key: CXF-6368 > URL: https://issues.apache.org/jira/browse/CXF-6368 > Project: CXF > Issue Type: Bug > Components: JAX-RS > Affects Versions: 3.0.3 > Reporter: Wei Zhang > Assignee: Sergey Beryozkin > Fix For: 3.1.0, 3.0.5 > > > Come from a TCK test: > The excepted response code was 500, but got 200. > The application is like this: > Throw a RuntimeException from a ContainerResponseFilter > public class CustomFilter implements ContainerResponseFilter { > @Override > public void filter(ContainerRequestContext requestContext, > ContainerResponseContext responseContext) throws > IOException { > throw new RuntimeException("exception From custom > ContainerResponseFilter"); > } > } > } > A RuntimeExceptionMapper mapped the exception and set response code to 200. > @Provider > public class RuntimeExceptionMapper implements > ExceptionMapper<RuntimeException> { > @Override > public Response toResponse(RuntimeException exception) { > return Response.ok(message).build(); > } > } > The filter was called first time, throw the exception, exception mapper > mapped it. > When running method serializeMessage() in JAXRSOutInterceptor, the filer was > called the second time, throw the exception again. In method > handleWriteException() of JAXRSOutInterceptor, becasue firstTry=false, the > exception was not mapped this time, setResponseStatus() was called. > In JAXRSDefaultFaultOutInterceptor, the method > JAXRSUtils.convertFaultToResponse() was called, the exception was mapped > again. Then in method serializeMessage(), the filter was called the third > time. RuntimeExceptionMapper mapped again. Then method serializeMessage() was > called again, then the filter was called the fourth time, throw exception > fourth time. Becasue firstTry=false, the exception was not mapped this time, > setResponseStatus() was called. > Now in message, can found response status is 500. But later the response > status 500 was lost when set oldMessage back. -- This message was sent by Atlassian JIRA (v6.3.4#6332)