设置CXF JAX-RS的基于代理的API,用于将@FormParam对象转换为JSON

问题描述

|| 快速总结问题: 我需要以某种方式配置使用CXF的基于代理的客户端API实现的JAX-RS客户端,以将带有@FormParam注释的参数自动转换为JSON。 我已经在Apache CXF JAX-RS中创建了一些服务,该服务将几个潜在的复杂对象作为参数。通过为复杂的bean实现valueOf(String s),我可以将多个JSON编码对象传递给\“ method \”,而不仅仅是一个,通常情况下就是这样。 一个示例实现可以如下:
@Service(\"receiverService\")
@Path(\"/receiver\")
public class ObjectReceiverService {
    @POST
    @Path(\"jsonTest\")
    @Produces(\"application/json\")
    public MyObject jsonTest(@FormParam(\"myPrimitive\") int myPrimitive,@FormParam(\"myComplex\") MyObject myComplex) {
        return myComplex;
    }
        ...//
}

//domain class with Mapper from Jackson
public class MyObject {
    public String foo;
    public String bar;
    public String baz;

    public static MyObject valueOf(String s) throws Exception {
        return new ObjectMapper().readValue(s,MyObject.class);
    }
        ...//implementation of equals() etc.
}
这工作得很好。到目前为止,我已经通过使用低级的东西对其进行了测试。使用Jackson \'s ObjectMapper等手动构造查询字符串。示​​例:
//test class with lots of manual setup using WebClient
public class ObjectReceiverServiceTest {
    @Before
    public void setup() {
        ProviderFactory.getSharedInstance().registerUserProvider(new JacksonJsonProvider());
    }
    @org.junit.Test
    public void jsonTest1_recievingSameObject() throws Exception {
        String url = \"http://localhost:8080/\";
        String path = \"rest/receiver/jsonTest\";

        MyObject myObjectToSend = new MyObject();
        MyObject result = new MyObject();
        myObjectToSend.foo = \"foo\";
        myObjectToSend.bar = \"bar\";
        myObjectToSend.baz = \"baz\";

        WebClient client = WebClient.create(url);
        client.path(path);
        client.accept(\"application/json\").type(MediaType.APPLICATION_FORM_URLENCODED_TYPE);
        Response r = client.post(\"myPrimitive=123&myComplex=\" + new ObjectMapper().writeValueAsString(myObjectToSend));

        result = new ObjectMapper().readValue(new BufferedReader(new InputStreamReader((InputStream) r.getEntity())).readLine(),MyObject.class);
        assertEquals(myObjectToSend,result);
    }
我想做的是使用基于代理的api,如CXF文档中所示。这样会更清洁,更快速地实施。以前的测试可能是这样的
@org.junit.Test
public void jsonTest2_recievingSameObject() throws Exception {
    String url = \"http://localhost:8080/rest\";
    ObjectReceiverService service = JAXRSClientFactory.create(url,ObjectReceiverService.class);

    MyObject myObjectToSend = new MyObject();
    myObjectToSend.foo = \"foo2\";
    myObjectToSend.bar = \"bar2\";
    myObjectToSend.baz = \"baz2\";
    MyObject result = service.jsonTest(123,myObjectToSend);

    assertEquals(myObjectToSend,result);
}
今天,这可能会在org.apache.cxf.jaxrs.provider.FormEncodingProvider.writeTo(..)中引发WebApplicationException,因为它可能只是期望的原语。 我不太确定该如何处理。有任何想法吗?是否可以以某种方式进行注释,例如@JSONtoString,以某种方式将对象toString方法神奇地替换为JSON?如String toString(){返回新的ObjectMapper.writeValueAsString(this); }     

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...