You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by eanbiso <bi...@hotmail.it> on 2013/05/17 12:04:59 UTC

Rest ws: how to return an empty List avoiding java.lang.IndexOutOfBoundsException

Hi all,
I have a problem with rest endPoint that return an empty list.
I have a ws interface like this:

    @GET
    @Produces("multipart/form-data;type=text/xml")
    @Path("/GetNetworkIDsManagedBy/{controller}")
    public List<Integer> GetNetworkIDsManagedBy(
			@PathParam("controller") int controller);

If in the implementor I return an empty list: 

    @Override
    public List<Integer> GetNetworkIDsManagedBy(int controller) {
        List<Integer> temp = new ArrayList<Integer>();
        return temp;
    }


this exception occurs:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
	at java.util.ArrayList.RangeCheck(Unknown Source)
	at java.util.ArrayList.get(Unknown Source)
	at
org.apache.cxf.jaxrs.ext.MessageContextImpl.convertToAttachments(MessageContextImpl.java:185)
	at
org.apache.cxf.jaxrs.ext.MessageContextImpl.put(MessageContextImpl.java:159)
	at
org.apache.cxf.jaxrs.impl.tl.ThreadLocalMessageContext.put(ThreadLocalMessageContext.java:83)
	at
org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:245)
	at
org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:257)
	at
org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:144)
	at
org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:83)
	at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
	at
org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
	at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
	at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123)
	at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:323)
	at
org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:289)
	at
org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)
	at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:942)
	at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:878)
	at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
	at
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
	at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
	at org.eclipse.jetty.server.Server.handle(Server.java:349)
	at
org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
	at
org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)
	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
	at
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:52)
	at
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
	at
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
	at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
	at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
	at java.lang.Thread.run(Unknown Source)


However, if I return null instead of the empty list, no exception occurs and
the client receive the response.
I'd like to get the same behavior, returning an empty list. 
Is it possible and how? 
Do I use wrong annotations?
Thanks a lot, 

Andrea




--
View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816.html
Sent from the cxf-user mailing list archive at Nabble.com.

Re: Rest ws: how to return an empty List avoiding java.lang.IndexOutOfBoundsException

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
On 17/05/13 16:49, eanbiso wrote:
>
>
>
> Thanks for the explanation.
> Another solution could be this?
> ..use the exception handler to map the exception and, in case of java.lang.IndexOutOfBoundsException, return a Response.Status.NO_CONTENT ?
>
>      public Response toResponse(Exception arg0) {
>          if(CHECK EXCEPTION TYPE){
>              ResponseBuilder builder = Response.status(Response.Status.NO_CONTENT);
>              return builder.build();
>          }
>      }
>
> Should it work?
>
It should as a workaround because ultimately we are dealing with a 
runtime bug. FYI, in your case, stating that it multipart/form-date and 
given that no provider is available for a root part representing 
List<Integer>, it really has to be HTTP 500 error - this is something 
I'll need to fix, reporting IndexOutOfBoundsException is really a bug :-)

Thanks, Sergey

> Andrea
>
>
> Date: Fri, 17 May 2013 04:21:13 -0700
> From: ml-node+s547215n5727820h40@n5.nabble.com
> To: bisomagic@hotmail.it
> Subject: Re: Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException
>
>
>
> 	On 17/05/13 11:52, eanbiso wrote:
>
>> I'm resting an original SOAP ws so what is important to me is to ensure the same behavior.
>
> What happens when you return 'null' on the WS path ?
>
>> I've seen that returning null, no exception server side occurs and mine "RestExceptionHandler", that implements ResponseHandler, ExceptionMapper<Exception>, is not called.
>
>> So probably "an empty body and HTTP status 204" is a good response for me.
>
>> How can I obtain this returning an empty list?
>
> This is not possible actually with an empty List. The runtime checks if
>
> the response entity is null, if it is then it returns a message with no
>
> body. It can't deduce that an empty List means no message body, given
>
> that in case of XML it will be wrapped in the empty XML payload which
>
> still represents a non-empty HTTP response body.
>
>
>> However if I wanted to wrap a List<Integer> into a bean, how should I proceed?
>
>
> Something like this:
>
>
> @XmlRootElement
>
> public class NetworkIds {
>
>     List<Integer> ids;
>
> }
>
>
> Cheers, Sergey
>
>> Thanks a lot,
>
>>
>
>> Andrea
>
>>
>
>> Date: Fri, 17 May 2013 03:36:12 -0700
>
>> From: [hidden email]
>
>> To: [hidden email]
>
>> Subject: Re: Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException
>
>>
>
>>
>
>>
>
>> 	Hi
>
>>
>
>> Please see comments below,
>
>>
>
>> On 17/05/13 11:04, eanbiso wrote:
>
>>
>
>>> Hi all,
>
>>
>
>>> I have a problem with rest endPoint that return an empty list.
>
>>
>
>>> I have a ws interface like this:
>
>>
>
>>>
>
>>
>
>>>        @GET
>
>>
>
>>>        @Produces("multipart/form-data;type=text/xml")
>
>>
>
>>>        @Path("/GetNetworkIDsManagedBy/{controller}")
>
>>
>
>>>        public List<Integer> GetNetworkIDsManagedBy(
>
>>
>
>>> 			@PathParam("controller") int controller);
>
>>
>
>>>
>
>>
>
>>> If in the implementor I return an empty list:
>
>>
>
>>>
>
>>
>
>>>        @Override
>
>>
>
>>>        public List<Integer> GetNetworkIDsManagedBy(int controller) {
>
>>
>
>>>            List<Integer> temp = new ArrayList<Integer>();
>
>>
>
>>>            return temp;
>
>>
>
>>>        }
>
>>
>
>>>
>
>>
>
>>>
>
>>
>
>>> this exception occurs:
>
>>
>
>>>
>
>>
>
>>> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
>
>>
>
>>> 	at java.util.ArrayList.RangeCheck(Unknown Source)
>
>>
>
>>> 	at java.util.ArrayList.get(Unknown Source)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.jaxrs.ext.MessageContextImpl.convertToAttachments(MessageContextImpl.java:185)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.jaxrs.ext.MessageContextImpl.put(MessageContextImpl.java:159)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.jaxrs.impl.tl.ThreadLocalMessageContext.put(ThreadLocalMessageContext.java:83)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:245)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:257)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:144)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:83)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:323)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:289)
>
>>
>
>>> 	at
>
>>
>
>>> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:942)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:878)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
>
>>
>
>>> 	at org.eclipse.jetty.server.Server.handle(Server.java:349)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)
>
>>
>
>>> 	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)
>
>>
>
>>> 	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:52)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
>
>>
>
>>> 	at
>
>>
>
>>> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
>
>>
>
>>> 	at java.lang.Thread.run(Unknown Source)
>
>>
>
>>>
>
>>
>
>>>
>
>>
>
>>> However, if I return null instead of the empty list, no exception occurs and
>
>>
>
>>> the client receive the response.
>
>>
>
>> In this case it has to be an empty body and HTTP status 204 - is what
>
>>
>
>> the client is seeing when you return null.
>
>>
>
>>
>
>>> I'd like to get the same behavior, returning an empty list.
>
>>
>
>>> Is it possible and how?
>
>>
>
>>> Do I use wrong annotations?
>
>>
>
>>
>
>> What exactly do you expect when you return an empty List<Integer> ?
>
>>
>
>> Empty body & 204 ? Or actually a proper multipart/form-data payload
>
>>
>
>> response with the root part containing some XML ?
>
>>
>
>>
>
>> FYI, JAXB provider will not handle List<Integer>, you will need to wrap
>
>>
>
>> it into a bean or if you prefer returning List - then wrap Integer into
>
>>
>
>> a bean
>
>>
>
>>
>
>> Cheers, Sergey
>
>>
>
>>
>
>>
>
>>> Thanks a lot,
>
>>
>
>>>
>
>>
>
>>> Andrea
>
>>
>
>>>
>
>>
>
>>>
>
>>
>
>>>
>
>>
>
>>>
>
>>
>
>>> --
>
>>
>
>>> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816.html
>>> Sent from the cxf-user mailing list archive at Nabble.com.
>
>>
>
>>>
>
>>
>
>>
>
>>
>
>> 	
>
>> 	
>
>> 	
>
>> 	
>
>>
>
>> 	
>
>>
>
>> 	
>
>> 	
>
>> 		If you reply to this email, your message will be added to the discussion below:
>
>> 		http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727818.html
>> 	
>
>> 	
>
>> 		
>
>> 		To unsubscribe from Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException, click here.
>
>>
>
>> 		NAML
>
>> 	 		 	   		
>
>>
>
>>
>
>>
>
>> --
>
>> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727819.html
>> Sent from the cxf-user mailing list archive at Nabble.com.
>
>>
>
>
>
> 	
> 	
> 	
> 	
>
> 	
>
> 	
> 	
> 		If you reply to this email, your message will be added to the discussion below:
> 		http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727820.html
> 	
> 	
> 		
> 		To unsubscribe from Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException, click here.
>
> 		NAML
> 	
>   		 	   		
>
>
>
> --
> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727856.html
> Sent from the cxf-user mailing list archive at Nabble.com.
>


-- 
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

RE: Rest ws: how to return an empty List avoiding java.lang.IndexOutOfBoundsException

Posted by eanbiso <bi...@hotmail.it>.


Thanks for the explanation.
Another solution could be this?
..use the exception handler to map the exception and, in case of java.lang.IndexOutOfBoundsException, return a Response.Status.NO_CONTENT ?

    public Response toResponse(Exception arg0) {
        if(CHECK EXCEPTION TYPE){
            ResponseBuilder builder = Response.status(Response.Status.NO_CONTENT);
            return builder.build();
        }
    }

Should it work?

Andrea


Date: Fri, 17 May 2013 04:21:13 -0700
From: ml-node+s547215n5727820h40@n5.nabble.com
To: bisomagic@hotmail.it
Subject: Re: Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException



	On 17/05/13 11:52, eanbiso wrote:

> I'm resting an original SOAP ws so what is important to me is to ensure the same behavior.

What happens when you return 'null' on the WS path ?

> I've seen that returning null, no exception server side occurs and mine "RestExceptionHandler", that implements ResponseHandler, ExceptionMapper<Exception>, is not called.

> So probably "an empty body and HTTP status 204" is a good response for me.

> How can I obtain this returning an empty list?

This is not possible actually with an empty List. The runtime checks if 

the response entity is null, if it is then it returns a message with no 

body. It can't deduce that an empty List means no message body, given 

that in case of XML it will be wrapped in the empty XML payload which 

still represents a non-empty HTTP response body.


> However if I wanted to wrap a List<Integer> into a bean, how should I proceed?


Something like this:


@XmlRootElement

public class NetworkIds {

   List<Integer> ids;

}


Cheers, Sergey

> Thanks a lot,

>

> Andrea

>

> Date: Fri, 17 May 2013 03:36:12 -0700

> From: [hidden email]

> To: [hidden email]

> Subject: Re: Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException

>

>

>

> 	Hi

>

> Please see comments below,

>

> On 17/05/13 11:04, eanbiso wrote:

>

>> Hi all,

>

>> I have a problem with rest endPoint that return an empty list.

>

>> I have a ws interface like this:

>

>>

>

>>       @GET

>

>>       @Produces("multipart/form-data;type=text/xml")

>

>>       @Path("/GetNetworkIDsManagedBy/{controller}")

>

>>       public List<Integer> GetNetworkIDsManagedBy(

>

>> 			@PathParam("controller") int controller);

>

>>

>

>> If in the implementor I return an empty list:

>

>>

>

>>       @Override

>

>>       public List<Integer> GetNetworkIDsManagedBy(int controller) {

>

>>           List<Integer> temp = new ArrayList<Integer>();

>

>>           return temp;

>

>>       }

>

>>

>

>>

>

>> this exception occurs:

>

>>

>

>> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

>

>> 	at java.util.ArrayList.RangeCheck(Unknown Source)

>

>> 	at java.util.ArrayList.get(Unknown Source)

>

>> 	at

>

>> org.apache.cxf.jaxrs.ext.MessageContextImpl.convertToAttachments(MessageContextImpl.java:185)

>

>> 	at

>

>> org.apache.cxf.jaxrs.ext.MessageContextImpl.put(MessageContextImpl.java:159)

>

>> 	at

>

>> org.apache.cxf.jaxrs.impl.tl.ThreadLocalMessageContext.put(ThreadLocalMessageContext.java:83)

>

>> 	at

>

>> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:245)

>

>> 	at

>

>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:257)

>

>> 	at

>

>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:144)

>

>> 	at

>

>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:83)

>

>> 	at

>

>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)

>

>> 	at

>

>> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)

>

>> 	at

>

>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)

>

>> 	at

>

>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123)

>

>> 	at

>

>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:323)

>

>> 	at

>

>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:289)

>

>> 	at

>

>> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)

>

>> 	at

>

>> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:942)

>

>> 	at

>

>> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:878)

>

>> 	at

>

>> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)

>

>> 	at

>

>> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)

>

>> 	at

>

>> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)

>

>> 	at org.eclipse.jetty.server.Server.handle(Server.java:349)

>

>> 	at

>

>> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)

>

>> 	at

>

>> org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)

>

>> 	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)

>

>> 	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)

>

>> 	at

>

>> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:52)

>

>> 	at

>

>> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)

>

>> 	at

>

>> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)

>

>> 	at

>

>> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)

>

>> 	at

>

>> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)

>

>> 	at java.lang.Thread.run(Unknown Source)

>

>>

>

>>

>

>> However, if I return null instead of the empty list, no exception occurs and

>

>> the client receive the response.

>

> In this case it has to be an empty body and HTTP status 204 - is what

>

> the client is seeing when you return null.

>

>

>> I'd like to get the same behavior, returning an empty list.

>

>> Is it possible and how?

>

>> Do I use wrong annotations?

>

>

> What exactly do you expect when you return an empty List<Integer> ?

>

> Empty body & 204 ? Or actually a proper multipart/form-data payload

>

> response with the root part containing some XML ?

>

>

> FYI, JAXB provider will not handle List<Integer>, you will need to wrap

>

> it into a bean or if you prefer returning List - then wrap Integer into

>

> a bean

>

>

> Cheers, Sergey

>

>

>

>> Thanks a lot,

>

>>

>

>> Andrea

>

>>

>

>>

>

>>

>

>>

>

>> --

>

>> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816.html
>> Sent from the cxf-user mailing list archive at Nabble.com.

>

>>

>

>

>

> 	

> 	

> 	

> 	

>

> 	

>

> 	

> 	

> 		If you reply to this email, your message will be added to the discussion below:

> 		http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727818.html
> 	

> 	

> 		

> 		To unsubscribe from Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException, click here.

>

> 		NAML

> 	 		 	   		

>

>

>

> --

> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727819.html
> Sent from the cxf-user mailing list archive at Nabble.com.

>



	
	
	
	

	

	
	
		If you reply to this email, your message will be added to the discussion below:
		http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727820.html
	
	
		
		To unsubscribe from Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException, click here.

		NAML
	
 		 	   		  



--
View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727856.html
Sent from the cxf-user mailing list archive at Nabble.com.

Re: Rest ws: how to return an empty List avoiding java.lang.IndexOutOfBoundsException

Posted by Sergey Beryozkin <sb...@gmail.com>.
On 17/05/13 11:52, eanbiso wrote:
> I'm resting an original SOAP ws so what is important to me is to ensure the same behavior.
What happens when you return 'null' on the WS path ?
> I've seen that returning null, no exception server side occurs and mine "RestExceptionHandler", that implements ResponseHandler, ExceptionMapper<Exception>, is not called.
> So probably "an empty body and HTTP status 204" is a good response for me.
> How can I obtain this returning an empty list?
This is not possible actually with an empty List. The runtime checks if 
the response entity is null, if it is then it returns a message with no 
body. It can't deduce that an empty List means no message body, given 
that in case of XML it will be wrapped in the empty XML payload which 
still represents a non-empty HTTP response body.

> However if I wanted to wrap a List<Integer> into a bean, how should I proceed?

Something like this:

@XmlRootElement
public class NetworkIds {
   List<Integer> ids;
}

Cheers, Sergey
> Thanks a lot,
>
> Andrea
>
> Date: Fri, 17 May 2013 03:36:12 -0700
> From: ml-node+s547215n5727818h78@n5.nabble.com
> To: bisomagic@hotmail.it
> Subject: Re: Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException
>
>
>
> 	Hi
>
> Please see comments below,
>
> On 17/05/13 11:04, eanbiso wrote:
>
>> Hi all,
>
>> I have a problem with rest endPoint that return an empty list.
>
>> I have a ws interface like this:
>
>>
>
>>       @GET
>
>>       @Produces("multipart/form-data;type=text/xml")
>
>>       @Path("/GetNetworkIDsManagedBy/{controller}")
>
>>       public List<Integer> GetNetworkIDsManagedBy(
>
>> 			@PathParam("controller") int controller);
>
>>
>
>> If in the implementor I return an empty list:
>
>>
>
>>       @Override
>
>>       public List<Integer> GetNetworkIDsManagedBy(int controller) {
>
>>           List<Integer> temp = new ArrayList<Integer>();
>
>>           return temp;
>
>>       }
>
>>
>
>>
>
>> this exception occurs:
>
>>
>
>> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
>
>> 	at java.util.ArrayList.RangeCheck(Unknown Source)
>
>> 	at java.util.ArrayList.get(Unknown Source)
>
>> 	at
>
>> org.apache.cxf.jaxrs.ext.MessageContextImpl.convertToAttachments(MessageContextImpl.java:185)
>
>> 	at
>
>> org.apache.cxf.jaxrs.ext.MessageContextImpl.put(MessageContextImpl.java:159)
>
>> 	at
>
>> org.apache.cxf.jaxrs.impl.tl.ThreadLocalMessageContext.put(ThreadLocalMessageContext.java:83)
>
>> 	at
>
>> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:245)
>
>> 	at
>
>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:257)
>
>> 	at
>
>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:144)
>
>> 	at
>
>> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:83)
>
>> 	at
>
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
>
>> 	at
>
>> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
>
>> 	at
>
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
>
>> 	at
>
>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123)
>
>> 	at
>
>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:323)
>
>> 	at
>
>> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:289)
>
>> 	at
>
>> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)
>
>> 	at
>
>> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:942)
>
>> 	at
>
>> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:878)
>
>> 	at
>
>> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
>
>> 	at
>
>> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
>
>> 	at
>
>> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
>
>> 	at org.eclipse.jetty.server.Server.handle(Server.java:349)
>
>> 	at
>
>> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
>
>> 	at
>
>> org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)
>
>> 	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)
>
>> 	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
>
>> 	at
>
>> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:52)
>
>> 	at
>
>> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
>
>> 	at
>
>> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
>
>> 	at
>
>> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
>
>> 	at
>
>> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
>
>> 	at java.lang.Thread.run(Unknown Source)
>
>>
>
>>
>
>> However, if I return null instead of the empty list, no exception occurs and
>
>> the client receive the response.
>
> In this case it has to be an empty body and HTTP status 204 - is what
>
> the client is seeing when you return null.
>
>
>> I'd like to get the same behavior, returning an empty list.
>
>> Is it possible and how?
>
>> Do I use wrong annotations?
>
>
> What exactly do you expect when you return an empty List<Integer> ?
>
> Empty body & 204 ? Or actually a proper multipart/form-data payload
>
> response with the root part containing some XML ?
>
>
> FYI, JAXB provider will not handle List<Integer>, you will need to wrap
>
> it into a bean or if you prefer returning List - then wrap Integer into
>
> a bean
>
>
> Cheers, Sergey
>
>
>
>> Thanks a lot,
>
>>
>
>> Andrea
>
>>
>
>>
>
>>
>
>>
>
>> --
>
>> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816.html
>> Sent from the cxf-user mailing list archive at Nabble.com.
>
>>
>
>
>
> 	
> 	
> 	
> 	
>
> 	
>
> 	
> 	
> 		If you reply to this email, your message will be added to the discussion below:
> 		http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727818.html
> 	
> 	
> 		
> 		To unsubscribe from Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException, click here.
>
> 		NAML
> 	 		 	   		
>
>
>
> --
> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727819.html
> Sent from the cxf-user mailing list archive at Nabble.com.
>


RE: Rest ws: how to return an empty List avoiding java.lang.IndexOutOfBoundsException

Posted by eanbiso <bi...@hotmail.it>.
I'm resting an original SOAP ws so what is important to me is to ensure the same behavior.
I've seen that returning null, no exception server side occurs and mine "RestExceptionHandler", that implements ResponseHandler, ExceptionMapper<Exception>, is not called.
So probably "an empty body and HTTP status 204" is a good response for me.
How can I obtain this returning an empty list?
However if I wanted to wrap a List<Integer> into a bean, how should I proceed?
Thanks a lot,

Andrea

Date: Fri, 17 May 2013 03:36:12 -0700
From: ml-node+s547215n5727818h78@n5.nabble.com
To: bisomagic@hotmail.it
Subject: Re: Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException



	Hi

Please see comments below,

On 17/05/13 11:04, eanbiso wrote:

> Hi all,

> I have a problem with rest endPoint that return an empty list.

> I have a ws interface like this:

>

>      @GET

>      @Produces("multipart/form-data;type=text/xml")

>      @Path("/GetNetworkIDsManagedBy/{controller}")

>      public List<Integer> GetNetworkIDsManagedBy(

> 			@PathParam("controller") int controller);

>

> If in the implementor I return an empty list:

>

>      @Override

>      public List<Integer> GetNetworkIDsManagedBy(int controller) {

>          List<Integer> temp = new ArrayList<Integer>();

>          return temp;

>      }

>

>

> this exception occurs:

>

> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

> 	at java.util.ArrayList.RangeCheck(Unknown Source)

> 	at java.util.ArrayList.get(Unknown Source)

> 	at

> org.apache.cxf.jaxrs.ext.MessageContextImpl.convertToAttachments(MessageContextImpl.java:185)

> 	at

> org.apache.cxf.jaxrs.ext.MessageContextImpl.put(MessageContextImpl.java:159)

> 	at

> org.apache.cxf.jaxrs.impl.tl.ThreadLocalMessageContext.put(ThreadLocalMessageContext.java:83)

> 	at

> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:245)

> 	at

> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:257)

> 	at

> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:144)

> 	at

> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:83)

> 	at

> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)

> 	at

> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)

> 	at

> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)

> 	at

> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123)

> 	at

> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:323)

> 	at

> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:289)

> 	at

> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)

> 	at

> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:942)

> 	at

> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:878)

> 	at

> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)

> 	at

> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)

> 	at

> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)

> 	at org.eclipse.jetty.server.Server.handle(Server.java:349)

> 	at

> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)

> 	at

> org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)

> 	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)

> 	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)

> 	at

> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:52)

> 	at

> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)

> 	at

> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)

> 	at

> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)

> 	at

> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)

> 	at java.lang.Thread.run(Unknown Source)

>

>

> However, if I return null instead of the empty list, no exception occurs and

> the client receive the response.

In this case it has to be an empty body and HTTP status 204 - is what 

the client is seeing when you return null.


> I'd like to get the same behavior, returning an empty list.

> Is it possible and how?

> Do I use wrong annotations?


What exactly do you expect when you return an empty List<Integer> ?

Empty body & 204 ? Or actually a proper multipart/form-data payload 

response with the root part containing some XML ?


FYI, JAXB provider will not handle List<Integer>, you will need to wrap 

it into a bean or if you prefer returning List - then wrap Integer into 

a bean


Cheers, Sergey



> Thanks a lot,

>

> Andrea

>

>

>

>

> --

> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816.html
> Sent from the cxf-user mailing list archive at Nabble.com.

>



	
	
	
	

	

	
	
		If you reply to this email, your message will be added to the discussion below:
		http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727818.html
	
	
		
		To unsubscribe from Rest ws: how to return an empty List<Integer> avoiding java.lang.IndexOutOfBoundsException, click here.

		NAML
	 		 	   		  



--
View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816p5727819.html
Sent from the cxf-user mailing list archive at Nabble.com.

Re: Rest ws: how to return an empty List avoiding java.lang.IndexOutOfBoundsException

Posted by Sergey Beryozkin <sb...@gmail.com>.
Hi
Please see comments below,
On 17/05/13 11:04, eanbiso wrote:
> Hi all,
> I have a problem with rest endPoint that return an empty list.
> I have a ws interface like this:
>
>      @GET
>      @Produces("multipart/form-data;type=text/xml")
>      @Path("/GetNetworkIDsManagedBy/{controller}")
>      public List<Integer> GetNetworkIDsManagedBy(
> 			@PathParam("controller") int controller);
>
> If in the implementor I return an empty list:
>
>      @Override
>      public List<Integer> GetNetworkIDsManagedBy(int controller) {
>          List<Integer> temp = new ArrayList<Integer>();
>          return temp;
>      }
>
>
> this exception occurs:
>
> java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
> 	at java.util.ArrayList.RangeCheck(Unknown Source)
> 	at java.util.ArrayList.get(Unknown Source)
> 	at
> org.apache.cxf.jaxrs.ext.MessageContextImpl.convertToAttachments(MessageContextImpl.java:185)
> 	at
> org.apache.cxf.jaxrs.ext.MessageContextImpl.put(MessageContextImpl.java:159)
> 	at
> org.apache.cxf.jaxrs.impl.tl.ThreadLocalMessageContext.put(ThreadLocalMessageContext.java:83)
> 	at
> org.apache.cxf.jaxrs.provider.MultipartProvider.writeTo(MultipartProvider.java:245)
> 	at
> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.serializeMessage(JAXRSOutInterceptor.java:257)
> 	at
> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.processResponse(JAXRSOutInterceptor.java:144)
> 	at
> org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor.handleMessage(JAXRSOutInterceptor.java:83)
> 	at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
> 	at
> org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:77)
> 	at
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
> 	at
> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:123)
> 	at
> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:323)
> 	at
> org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:289)
> 	at
> org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)
> 	at
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:942)
> 	at
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:878)
> 	at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
> 	at
> org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
> 	at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
> 	at org.eclipse.jetty.server.Server.handle(Server.java:349)
> 	at
> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
> 	at
> org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:919)
> 	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:582)
> 	at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:218)
> 	at
> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:52)
> 	at
> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
> 	at
> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
> 	at
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
> 	at
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
> 	at java.lang.Thread.run(Unknown Source)
>
>
> However, if I return null instead of the empty list, no exception occurs and
> the client receive the response.

In this case it has to be an empty body and HTTP status 204 - is what 
the client is seeing when you return null.

> I'd like to get the same behavior, returning an empty list.
> Is it possible and how?
> Do I use wrong annotations?

What exactly do you expect when you return an empty List<Integer> ?
Empty body & 204 ? Or actually a proper multipart/form-data payload 
response with the root part containing some XML ?

FYI, JAXB provider will not handle List<Integer>, you will need to wrap 
it into a bean or if you prefer returning List - then wrap Integer into 
a bean

Cheers, Sergey


> Thanks a lot,
>
> Andrea
>
>
>
>
> --
> View this message in context: http://cxf.547215.n5.nabble.com/Rest-ws-how-to-return-an-empty-List-Integer-avoiding-java-lang-IndexOutOfBoundsException-tp5727816.html
> Sent from the cxf-user mailing list archive at Nabble.com.
>