无法使用JAX-RS(CXF)解组JSON到对象

时间:2016-12-04 21:37:42

标签: java web-services rest cxf

使用最新版本的CXF和其他依赖项,我正在尝试对生成和使用JSON的Web服务进行单元测试。当method参数为String时测试有效,但当参数为自定义对象时失败。以下是示例资源:

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("testPost")
public Employee getPostTest(Employee data) {
    return data;
}

以下是测试用例的摘录

    List<Object> providers = new ArrayList<Object>();
    providers.add(new JacksonJaxbJsonProvider());
    WebClient client = WebClient.create(ENDPOINT_ADDRESS, providers);
    client.accept("application/json");
    client.type("application/json");
    client.path("users/testPost/");
    Employee e = new Employee();
    e.setName("Test");
    Response r = client.post(e);

上述代码的最后一行引发以下异常:

  

2016年12月5日上午2:46:50 org.apache.cxf.jaxrs.utils.JAXRSUtils logMessageHandlerProblem   严重:找不到类com.finity.model.Employee,ContentType:application / json的消息正文阅读器   2016年12月5日上午2:46:50 org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse   警告:javax.ws.rs.WebApplicationException:HTTP 415不支持的媒体类型       at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1315)       at org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:826)       在org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:789)

尝试使用JSONParser读取但不执行:

    Employee e = new Employee();
    e.setName("Test");
    Response r = client.post(e);

    MappingJsonFactory factory = new MappingJsonFactory();
    JsonParser parser = factory.createJsonParser((InputStream)r.getEntity());

2 个答案:

答案 0 :(得分:0)

您需要配置JSON提供程序。例如Jackson

 <jaxrs:providers>
   <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
  </jaxrs:providers>

JacksonJaxbJsonProvider(使用JAXB bean时)

如果您没有maven依赖项,还需要添加它。            org.codehaus.jackson       杰克逊JAXRS       1.9.0    

请参阅CXF JSON support

答案 1 :(得分:0)

我不确定这个解决方案是否适合所有人,但我就是这样解决的。

我的 Employee 课程最初是这样的:

@Data
public class Employee {
    private String attribute1;
    private String attribute2;
}

@Data 是一个 Lombok 注释,它为类提供了 Getter、Setter 和 toString 方法。

我用这些注释更新了 MyRequest 类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@XmlRootElement(name = "employee")
public class Employee {
    private String attribute1;
    private String attribute2;
}

也就是说,我在类中添加了以下 3 个新注释,并解决了该问题。 @NoArgsConstructor
@AllArgsConstructor
@XmlRootElement

@NoArgsConstructor 是 Lombok 注释,用于创建无参数构造函数。

@AllArgsConstructor 是一个 Lombok 注释,用于创建一个全参数构造函数。

@XmlRootElement 来自 javax.xml.bind 包,它导致在架构中生成全局元素声明。全局元素声明与类映射到的 XML 模式类型相关联。

虽然我没有时间将 3 个注释中的每一个逐一隔离以查看哪一个实际上解决了此问题,但我的直觉是添加 @XmlRootElement 注释可能已为我解决了此问题。< /p>