You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "iris ding (JIRA)" <ji...@apache.org> on 2015/04/26 04:27:38 UTC
[jira] [Commented] (CXF-6373) CompletionCallback can not get the
Throwable if error occurs in other interceptor (no
serviceinvokerInterceptor)
[ https://issues.apache.org/jira/browse/CXF-6373?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14512834#comment-14512834 ]
iris ding commented on CXF-6373:
--------------------------------
The client:
//step 1
Response response1 = client.target("http://localhost:9080/cdi11_rs20/rest/resource/clear").request().get();
response1.close();
//step 2
Response response = client.target("http://localhost:9080/cdi11_rs20/rest/resource/reset").request().get();
response.close();
//step 3
Future<Response> suspend = client.target("http://localhost:9080/cdi11_rs20/rest/resource/suspend").request().async().get();
//step 4
Future<Response> register = client.target("http://localhost:9080/cdi11_rs20/rest/resource/register?stage=0").request().async().get();
// step 5
Future<Response> exception = client.target("http://localhost:9080/cdi11_rs20/rest/resource/exception?stage=1").request().async().get();
Response response2 = exception.get();
Response suspendResponse = suspend.get();
suspendResponse.close();
//step 6
Future<Response> error = client.target("http://localhost:9080/cdi11_rs20/rest/resource/error").request().async().get();
System.out.println("eeee" + error.get().readEntity(String.class)); // need to get RunTimeException
Two missied method in Resouce:
@GET
@Path("error")
public String getErrorValue() {
String name = MyCompletionCallback.getLastThrowableName();
return name;
}
@GET
@Path("clear")
public void clear() {
for (int i = 0; i != stage.length; i++)
stage[i].clear();
}
@GET
@Path("reset")
public void resetErrorValue() {
MyCompletionCallback.resetLastThrowableName();
}
protected static AsyncResponse takeAsyncResponse(int stageId) {
final ResponseBuilder error = createErrorResponseBuilder();
AsyncResponse asyncResponse = null;
try {
asyncResponse = stage[stageId].take();
} catch (InterruptedException e) {
throw new WebApplicationException(error.entity(
"ArrayBlockingQueue#take").build());
}
return asyncResponse;
}
protected static final void addResponse(AsyncResponse response, String stageId) {
int id = Integer.parseInt(stageId) + 1;
if (id != stage.length)
stage[id].add(response);
}
> 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: 3.0.3, 3.0.4, 2.7.15
> 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)