2013-05-02 42 views
0

也許這是非常微不足道的,但不知何故,我一直無法找到爲什麼這不起作用!當通過cxf jaxrs調用時傳遞日期輸入:客戶端

我有一個通過CXF的JAXRS暴露的服務:服務器指令

<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。如果有人能指出哪裏出了問題 - 大部分是我配置不正確的東西,我會非常感激,因爲這在配置Handler時會被視爲開箱即用。

在此先感謝!

P.S .:我有一個測試setup如果有人想看到它的行動。

回答

1

看起來像使用正確的方式ParamConverter也是爲了實現ParamConverterProvider接口以及here

@SuppressWarnings("unchecked") 
@Override 
public <T> ParamConverter<T> getConverter(Class<T> rawType, 
     Type genericType, Annotation[] annotations) { 
    if (rawType == Date.class) { 
     return (ParamConverter<T>) this; 
    } 
    return null; 
} 

不熱乎的兩個接口幫助實現同樣的事情,謝爾蓋的概念JSR-339郵件列表上說 - 但你必須遵循的規格! :)

這似乎擺脫了錯誤 - 希望這可以幫助別人。 另外,如果我採取了不正確的路線,請隨時糾正我。謝謝!

相關問題