我有服务
@POST
@Path("/post")
@Consumes("application/json")
public Response createProductInJSON(Product product) {
String result = "Product created : " + product;
return Response.status(201).entity(result).build();
}
和消费者
url = new URL(
"http://localhost:8080/TestRestWebService/json/product/post");
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
Gson gson = new Gson();
Product p = new Product();
p.setName("varun");
p.setQty(33);
String input = gson.toJson(p).toString();
OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
取自link
消费者正在抛出
Exception in thread "main" java.lang.RuntimeException: Failed : HTTP error code : 500
at com.mkyong.rest.Consumer.main(Consumer.java:52)
Web服务正在抛出
SEVERE: Failed executing POST /json/product/post org.jboss.resteasy.spi.InternalServerErrorException: Bad arguments passed to public javax.ws.rs.core.Response com.mkyong.rest.JSONService.createProductInJSON(com.mkyong.rest.Product)
(org.jboss.resteasy.spi.BadRequestException org.jboss.resteasy.spi.BadRequestException: Could not find message body reader for type: class com.mkyong.rest.Product of content type: application/json )
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:181)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: argument type mismatch at
虽然product
类只有2个参数qty
,但只有name
。
答案 0 :(得分:1)
错误消息是
找不到类型的邮件正文阅读器:class com.mkyong.rest.Product of content type:application / json
这意味着您没有可以处理JSON的MessageBodyReader
,或者您拥有JSON,但未注册。
在您的情况下,您拥有resteasy-jackson-provider
,但它仍然依赖于核心杰克逊库的其余部分,
jackson-core-asl
jackson-jaxrs
jackson-mapper-asl
jackson-xc
对于特定版本的resteasy-jackson-provider:2.2.1
,使用的Jackson版本是1.6.3。您可以下载这些邮箱here。只需向下滚动并单击每个罐子的 1.6.3 按钮,然后单击每个罐子的下载(JAR),并将它们添加到您的项目中。
对于其他任何人,不使用REST的2.2.1版本,您应该选择与RESTeasy版本一致的正确Jackson版本。您可以看到here并选择您正在使用的RESTeasy版本。
另请注意,我提供的链接适用于Jackson 1.x版本,因为这是resteasy-jackson-provider
使用的版本。如果您使用的是更新的3.x版本的RESTeasy,`resteasy-jackson2-provider
答案 1 :(得分:0)
看起来'application / json'无法解析
@Consumes(MediaType.APPLICATION_JSON)
确保添加了正确的依赖
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>3.0.13.Final</version>
</dependency>