使用最新版本的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());
答案 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>