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