Hi Anthony
On 18/04/12 12:32, Muller, Anthony wrote:
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],...

I think the headers can be lower-case internally, I recall it was there for a long time, but as far as JAX-RS HttpHeaders is concerned (and which is used to retrieve Content-Length), it's case-insensitive. I suspect my original code checking for the empty content was a bit primitive, I really hope it has been fixed in the latest 2.3.10 maintenance release

Cheers, Sergey
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









Reply via email to