Возможно, это действительно тривиально, но почему-то мне не удалось найти, почему это не работает!Ввод даты передачи при вызове через cxf jaxrs: client
У меня есть служба, которая подвергается воздействию через jaxrs CxF'S: директива сервера
<jaxrs:server id="specialServiceRS"
address="http://localhost:8080/specialServiceRS">
<jaxrs:serviceBeans>
<ref bean="specialService" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean id="jaxbProvider"
class="org.apache.cxf.jaxrs.provider.JAXBElementProvider">
<property name="marshallAsJaxbElement" value="true" />
<property name="unmarshallAsJaxbElement" value="true" />
</bean>
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider">
<property name="mapper" ref="jacksonMapper" />
</bean>
<bean class="com.kilo.ProgressiveDateHandler" />
</jaxrs:providers>
</jaxrs:server>
<bean id="jacksonMapper" class="org.codehaus.jackson.map.ObjectMapper">
<property name="serializationConfig.dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyyMMddHH:mm:ss.S" />
</bean>
</property>
<property name="deserializationConfig.dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg value="yyyyMMddHH:mm:ss.S" />
</bean>
</property>
</bean>
Чтобы иметь возможность правильно обрабатывать даты, мы добавили обработчик дату - ProgressiveDateHandler - какой ParameterHandler и ParamConverter. Это, кажется, работает хорошо, когда вызывается с помощью браузера - однако при вызове через клиент, основанный на Java настраивался через CxF игровая jaxrs: директива клиента,
<jaxrs:client id="specialServiceClient" serviceClass="com.kilo.SpecialServiceImpl"
address="http://localhost:8080/specialServiceRS">
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider">
<property name="mapper" ref="jacksonMapper" />
</bean>
<bean class="com.kilo.ProgressiveDateHandler" />
</jaxrs:providers>
</jaxrs:client>
<bean id="jacksonMapper" class="org.codehaus.jackson.map.ObjectMapper">
</bean>
Я получаю следующее сообщение об ошибке:
java.lang.IllegalArgumentException: Null value on 0 position
at org.apache.cxf.jaxrs.impl.UriBuilderImpl.toStringList(UriBuilderImpl.java:767)
at org.apache.cxf.jaxrs.impl.UriBuilderImpl.queryParam(UriBuilderImpl.java:660)
at org.apache.cxf.jaxrs.client.AbstractClient.addMatrixOrQueryToBuilder(AbstractClient.java:671)
at org.apache.cxf.jaxrs.client.AbstractClient.convertMatrixOrQueryToBuilder(AbstractClient.java:661)
at org.apache.cxf.jaxrs.client.AbstractClient.addMatrixQueryParamsToBuilder(AbstractClient.java:638)
at org.apache.cxf.jaxrs.client.ClientProxyImpl.handleQueries(ClientProxyImpl.java:432)
at org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:162)
at org.apache.cxf.common.util.CglibProxyHelper$1.intercept(CglibProxyHelper.java:67)
at com.kilo.SpecialServiceImpl$$EnhancerByCGLIB$$f5c4ae3f.getSomeStringsWithDateInput(<generated>)
at com.kilo.SpecialServiceJaxRSTest.testGetSomeStringsWithDateInput(SpecialServiceJaxRSTest.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:292)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
На дальнейшей отладки , похоже, что он использует org.apache.cxf.jaxrs.provider.ProviderFactory $ LegacyParamConverter вместо моего ParamConverter, а именно. ProgressiveDateHandler. Было бы очень полезно, если бы кто-то мог указать, что происходит не так - в основном что-то, что я неправильно настроил, потому что это следует рекламировать как работу из коробки при настройке обработчика.
Заранее благодарен!
P.S .: У меня есть тест setup, если кто-то хочет увидеть его в действии.