iris ding created CXF-6373: ------------------------------ Summary: CompletionCallback can not get the Throwable if error occurs in other interceptor (no serviceinvokerInterceptor) Key: CXF-6373 URL: https://issues.apache.org/jira/browse/CXF-6373 Project: CXF Issue Type: Bug Components: JAX-RS Affects Versions: 2.7.15, 3.0.4, 3.0.3 Reporter: iris ding
//Resource class @Path("resource") public class Resource { private static final AsyncResponseBlockingQueue[] step = { new AsyncResponseBlockingQueue(1), new AsyncResponseBlockingQueue(1), new AsyncResponseBlockingQueue(1)}; @GET @Path("suspend") public void suspend(@Suspended AsyncResponse asyncResponse) { step[0].add(asyncResponse); } @GET @Path("register") public String registerObject(@QueryParam("step") String step) { AsyncResponse async = takeAsyncResponse(step); boolean b = async.register(new MyCompletionCallback()).isEmpty(); addResponse(async, step); return b ? TRUE : FALSE; } @GET @Path("exception") public String throwExceptionOnAsyncResponse( @QueryParam("step") String step) { System.out.println("********throwExceptionOnAsyncResponse"); AsyncResponse async = takeAsyncResponse(step); System.out.println("*****async is not null: " + async); boolean b = async.resume(new ExceptionThrowingStringBean( "throw exception")); System.out.println("execuet finished for resume!!!"); addResponse(async, step); return b ? TRUE : FALSE; } } /////// StringBean public class StringBean { private String header; public String get() { return header; } public void set(String header) { this.header = header; } @Override public String toString() { return "StringBean. To get a value, use rather #get() method."; } public StringBean(String header) { super(); this.header = header; } } /////// Throw Exception here public class ExceptionThrowingStringBean extends StringBean { public ExceptionThrowingStringBean(String header) { super(header); } @Override public String get() { throw new RuntimeException(new IOException(super.get())); } } ////// Register a provider to deal with StringBean, // This cause we have an exception thrown in JaxrsOutInterceptor @Provider public class StringBeanEntityProvider implements MessageBodyReader<StringBean>, MessageBodyWriter<StringBean> { @Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return StringBean.class.isAssignableFrom(type); } @Override public long getSize(StringBean t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return t.get().length(); } @Override public void writeTo(StringBean t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { entityStream.write(t.get().getBytes()); } @Override public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return isWriteable(type, genericType, annotations, mediaType); } @Override public StringBean readFrom(Class<StringBean> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { String stream = JaxrsUtil.readFromStream(entityStream); StringBean bean = new StringBean(stream); return bean; } } ////// Need to get the exception throwed from ExceptionThrowingStringBean.get() method in this callback public class MyCompletionCallback implements CompletionCallback { private static String throwableName; public static final String NULL = "NULL"; public static final String NONAME = "No name has been set yet"; @Override public void onComplete(Throwable throwable) { throwableName = throwable == null ? NULL : throwable.getClass() .getName(); } public static final String getLastThrowableName() { return throwableName; } public static final void resetLastThrowableName() { throwableName = NONAME; } } -- This message was sent by Atlassian JIRA (v6.3.4#6332)