[ 
https://issues.apache.org/jira/browse/CXF-6588?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14740751#comment-14740751
 ] 

Sergey Beryozkin edited comment on CXF-6588 at 9/11/15 1:00 PM:
----------------------------------------------------------------

Thanks for the test. It proved to be related to the fact that injecting 
contexts into param converter providers was not complete as it was not clear if 
it was even required by the spec. Not sure if using a generic MBW/MBR from the 
converters works - if you pass JSON or XML as a header or as a query then you 
can not rely on Content-Type, etc, though I agree it can work if there's an 
implicit knowledge that a query/header parameter represents an encoded XML 
payload, etc...



was (Author: sergey_beryozkin):
Thanks for the test. It proved to be related to the fact that injecting 
contexts into param converter providers was not complete as it was not clear if 
it was even required by the spec. Not sure if using a generic MBW/MBR from the 
converters works - if you pass JSON or XML as a header or as a property then 
you can not rely on Content-Type, etc, though I agree it can work if there's an 
implicit knowledge that a query/header parameter represents an encoded XML 
payload, etc...


> NPE in providers.getMessageBodyReader
> -------------------------------------
>
>                 Key: CXF-6588
>                 URL: https://issues.apache.org/jira/browse/CXF-6588
>             Project: CXF
>          Issue Type: Bug
>          Components: JAX-RS
>    Affects Versions: 3.1.2
>            Reporter: David J. M. Karlsen
>             Fix For: 3.1.3, 3.0.7
>
>
> I have this ParamConverter:
> {code}
> @Provider
> @Component
> public class JacksonParamConverterProvider
>     implements ParamConverterProvider
> {
>     private final JsonMapperConfigurator jsonMapperConfigurator;
>     @Context
>     private Providers providers;
>     public JacksonParamConverterProvider()
>     {
>         ObjectMapper objectMapper = new ObjectMapper();
>         this.jsonMapperConfigurator =
>             new JsonMapperConfigurator( objectMapper, new Annotations[]{ 
> Annotations.JAXB, Annotations.JACKSON } );
>     }
>     @Override
>     public <T> ParamConverter<T> getConverter( Class<T> rawType, Type 
> genericType, Annotation[] annotations )
>     {
>         MessageBodyReader<T> messageBodyReader = 
> providers.getMessageBodyReader( rawType,
>                                                                               
>    genericType,
>                                                                               
>    annotations,
>                                                                               
>    MediaType.APPLICATION_JSON_TYPE );
>         if ( messageBodyReader == null || !messageBodyReader.isReadable( 
> rawType, genericType, annotations, MediaType.APPLICATION_JSON_TYPE ) ) {
>             return null;
>         }
>         if ( canConvert( rawType ) )
>         {
>             return new ParamConverter<T>()
>             {
>                 @Override
>                 public T fromString( String value )
>                 {
>                     ObjectReader objectReader = getObjectMapper().readerFor( 
> rawType );
>                     try
>                     {
>                         return objectReader.readValue( value );
>                     }
>                     catch ( IOException e )
>                     {
>                         throw new ProcessingException( e );
>                     }
>                 }
>                 @Override
>                 public String toString( T value )
>                 {
>                     try
>                     {
>                         return getObjectMapper().writerFor( rawType 
> ).writeValueAsString( value );
>                     }
>                     catch ( JsonProcessingException e )
>                     {
>                         throw new ProcessingException( e );
>                     }
>                 }
>             };
>         }
>         else
>         {
>             return null;
>         }
>     }
>     private ObjectMapper getObjectMapper()
>     {
>         return jsonMapperConfigurator.getConfiguredMapper();
>     }
>     private boolean isNotSimpleType( Class<?> rawType )
>     {
>         return ! ( rawType.getPackage().getName().startsWith( "java.lang" ) 
> || ClassUtils.isPrimitiveOrWrapper( rawType ) );
>     }
>     private boolean canConvert( Class<?> rawType )
>     {
>         return isNotSimpleType( rawType ) && getObjectMapper().canSerialize( 
> rawType );
>     }
> {code}
> which will get an NPE when calling getMessageBodyReader:
> {noformat}
> java.lang.NullPointerException: null
>       at 
> org.apache.cxf.jaxrs.impl.tl.ThreadLocalProviders.getMessageBodyReader(ThreadLocalProviders.java:39)
>  ~[cxf-rt-frontend-jaxrs-3.1.2.jar:3.1.2]
>       at 
> com.edb.fs.tac.jfr.srv.ws.jaxrs.JacksonParamConverterProvider.getConverter(JacksonParamConverterProvider.java:50)
>  ~[classes/:na]
>       at 
> org.apache.cxf.jaxrs.provider.ProviderFactory.createParameterHandler(ProviderFactory.java:256)
>  ~[cxf-rt-frontend-jaxrs-3.1.2.jar:3.1.2]
>       at 
> org.apache.cxf.jaxrs.client.AbstractClient.convertParamValue(AbstractClient.java:742)
>  ~[cxf-rt-rs-client-3.1.2.jar:3.1.2]
>       at 
> org.apache.cxf.jaxrs.client.AbstractClient.header(AbstractClient.java:139) 
> ~[cxf-rt-rs-client-3.1.2.jar:3.1.2]
>       at org.apache.cxf.jaxrs.client.WebClient.header(WebClient.java:846) 
> ~[cxf-rt-rs-client-3.1.2.jar:3.1.2]
>       at org.apache.cxf.jaxrs.client.WebClient.header(WebClient.java:83) 
> ~[cxf-rt-rs-client-3.1.2.jar:3.1.2]
>       at 
> com.edb.fs.tac.jfr.srv.ws.AbstractJaxRsSpringWithMocksTest.setHttpHeaders(AbstractJaxRsSpringWithMocksTest.java:109)
>  ~[test-classes/:na]
>       at 
> com.edb.fs.tac.jfr.srv.ws.AbstractJaxRsSpringWithMocksTest.getWebClient(AbstractJaxRsSpringWithMocksTest.java:63)
>  ~[test-classes/:na]
>       at 
> com.edb.fs.tac.jfr.srv.ws.AbstractJaxRsSpringWithMocksTest.getClientProxy(AbstractJaxRsSpringWithMocksTest.java:79)
>  ~[test-classes/:na]
>       at 
> com.edb.fs.tac.jfr.srv.ws.service.customer.CustomerResourceIntegrationTest.testWithComplexQueryObjectWithSubComplexTypes(CustomerResourceIntegrationTest.java:69)
>  ~[test-classes/:na]
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
> ~[na:1.8.0_60]
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
> ~[na:1.8.0_60]
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>  ~[na:1.8.0_60]
>       at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_60]
>       at 
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
>  ~[junit-4.12.jar:4.12]
>       at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>  ~[junit-4.12.jar:4.12]
>       at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
>  ~[junit-4.12.jar:4.12]
>       at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
>  ~[junit-4.12.jar:4.12]
>       at 
> org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
>  ~[spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
>       at 
> org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:85)
>  ~[spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
>       at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55) 
> ~[junit-4.12.jar:4.12]
>       at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
> [junit-4.12.jar:4.12]
>       at 
> org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:86)
>  [spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
>       at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
> [junit-4.12.jar:4.12]
>       at 
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:241)
>  [spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
>       at 
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87)
>  [spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
>       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
> [junit-4.12.jar:4.12]
>       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
> [junit-4.12.jar:4.12]
>       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
> [junit-4.12.jar:4.12]
>       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
> [junit-4.12.jar:4.12]
>       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
> [junit-4.12.jar:4.12]
>       at 
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
> [junit-4.12.jar:4.12]
>       at 
> org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
>  [spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
>       at 
> org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
>  [spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
>       at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
> [junit-4.12.jar:4.12]
>       at 
> org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
>  [spring-test-4.2.1.RELEASE.jar:4.2.1.RELEASE]
>       at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
> [junit-4.12.jar:4.12]
>       at 
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
>  [junit-rt.jar:na]
>       at 
> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
>  [junit-rt.jar:na]
>       at 
> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68) 
> [junit-rt.jar:na]
> {noformat}
> I am running with localtransport.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to