Hello Sergey,

In my usecase, the header I send is 'Content-Length', but header names are not 
casesentive I think?

Result of logging interceptor:
Headers: {Accept=[application/xml], connection=[keep-alive], 
Content-Length=[63], content-type=[application/xml], host=[localhost:9080], 
user-agent=[Java/1.6.0_25],...

Anthony

-----Original Message-----
From: Sergey Beryozkin [mailto:[email protected]] 
Sent: jeudi 29 mars 2012 17:23
To: [email protected]
Subject: Re: CXF and optional entity parameters

Hi Anthony
On 29/03/12 15:27, Muller, Anthony wrote:
> Thanks Sergey, your tip is working perfectly.
>
nice, thanks, by the way, I wonder how does HttpServletRequest determine 
the length <= 0, right now JAXBElementProvider checks 'Content-Length', 
do you have it in the lower case format coming in ?

Can you please add the org.apache.cxf.interceptor.LoggingInInterceptor, 
using the "jaxrs.inInterceptors" servlet parameter if using 
CXFNonSpringJaxrsServlet ?
I was a bit cautious about using InputStream.available() - it does not 
seem to guarantee the data are not actually available if if it returns 0.

Re Nillable - I guess that can be done - it is the default for all the 
providers (if no body is available) except JAXB

Thanks, Sergey



> Cheers,
> Anthony
>
> import java.io.IOException;
> import java.io.InputStream;
> import java.lang.annotation.Annotation;
> import java.lang.reflect.Type;
>
> import javax.ws.rs.core.MediaType;
> import javax.ws.rs.core.MultivaluedMap;
>
> import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
>
> public class ExtendedJAXBElementProvider extends JAXBElementProvider {
>
>       @Override
>       public Object readFrom(Class<Object>  type, Type genericType, 
> Annotation[] anns, MediaType mt, MultivaluedMap<String, String>  headers, 
> InputStream is) throws IOException {
>               if (getContext().getHttpServletRequest().getContentLength()<= 
> 0) {
>                       return null;
>               }
>               return super.readFrom(type, genericType, anns, mt, headers, is);
>       }
> }
>
>
> -----Original Message-----
> From: Muller, Anthony [mailto:[email protected]]
> Sent: jeudi 29 mars 2012 16:19
> To: [email protected]
> Subject: RE: CXF and optional entity parameters
>
> Hey Sergey,
>
> I'm using the version 2.3.8.
>
> I'm going to check what I can do with JAXBElementProvider.
>
> Note: if I could add something like @Nullable on my parameter, it will be 
> perfect :)
>
> Cheers,
> Anthony
>
> -----Original Message-----
> From: Sergey Beryozkin [mailto:[email protected]]
> Sent: mardi 27 mars 2012 17:11
> To: [email protected]
> Subject: Re: CXF and optional entity parameters
>
> Hi
> On 27/03/12 15:09, Muller, Anthony wrote:
>> Hello,
>>
>> I did not find the answer of this issue.
>>
>> Everything works perfectly when "entity" (a JAXB pojo) is not null.
>>
>> @Path("/")
>> public class myClass {
>>
>>       @PUT
>>       @Path("/{p1}/something/{p2}/something/{p3}/something/{p4}")
>>       @Consumes(MediaType.APPLICATION_XML)
>>       Response updateStuff(
>>                       @PathParam("p1") String p1,
>>                       @PathParam("p2") Long p2,
>>                       @PathParam("p3") String p3,
>>                       @PathParam("p4") Long p4,
>>                       MyEntity entity);
>> }
>>
>> But if I do not send anything about "entity" (because it is optional), I 
>> received the bellow error.
>
> JAX-RS 1.1 requires 400 returned in cases where an empty payload is
> presented to JAXB providers, which CXF version are you working with ?
> Is it 2.3.7 ? I'm seeing JAXBElementProvider checking on Content-Length
> header, can you please register a LoggingInInterceptor or capture the
> request with the tcp trace utility and let me know if Content-Length is
> available ?
>
>>
>> Please can you help me to fix?
>>
>
> If you do expect 'null' then the best thing to do is to register a
> custom JAXBElementProvider which overrides readFrom(...) and return null
> if the request is empty, the protected getContext() returning CXF
> MessageContext will help...
>
> Let me know please if you need more info...
>
> Sergey
>
>> Regards,
>> Anthony
>>
>>
>> 27 mars 2012 16:03:47 org.apache.cxf.jaxrs.provider.AbstractJAXBProvider 
>> handleJAXBException
>> ATTENTION: javax.xml.bind.UnmarshalException
>>    - with linked exception:
>> [com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
>>    at [row,col {unknown-source}]: [1,0]]
>>      at 
>> com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:426)
>>      at 
>> com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362)
>>      at 
>> com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:332)
>>      at 
>> org.apache.cxf.jaxrs.provider.JAXBElementProvider.unmarshalFromInputStream(JAXBElementProvider.java:223)
>>      at 
>> org.apache.cxf.jaxrs.provider.JAXBElementProvider.doUnmarshal(JAXBElementProvider.java:189)
>>      at 
>> org.apache.cxf.jaxrs.provider.JAXBElementProvider.readFrom(JAXBElementProvider.java:160)
>>      at 
>> org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:990)
>>      at 
>> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:589)
>>      at 
>> org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:554)
>>      at 
>> org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:230)
>>      at 
>> org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:88)
>>      at 
>> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
>>      at 
>> org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113)
>>      at 
>> org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:97)
>>      at 
>> org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461)
>>      at 
>> org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:149)
>>      at 
>> org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148)
>>      at 
>> org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
>>      at 
>> org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:103)
>>      at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
>>      at 
>> org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)
>>      at 
>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
>>      at 
>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
>>      at 
>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
>>      at 
>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
>>      at 
>> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
>>      at 
>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
>>      at 
>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
>>      at 
>> org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
>>      at 
>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
>>      at 
>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
>>      at 
>> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
>>      at 
>> org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
>>      at 
>> org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
>>      at 
>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>>      at 
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>>      at java.lang.Thread.run(Thread.java:662)
>> Caused by: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
>>    at [row,col {unknown-source}]: [1,0]
>>      at 
>> com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:682)
>>      at 
>> com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java:2090)
>>      at 
>> com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:1996)
>>      at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1100)
>>      at 
>> com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:160)
>>      at 
>> com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:360)
>>      ... 35 more
>>
>>
>>
>
>


-- 
Sergey Beryozkin

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

Blog: http://sberyozkin.blogspot.com

Reply via email to