Restful service argument mismatch exception

时间:2015-11-03 07:02:43

标签: java json web-services rest

我有服务

@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

Lib

2 个答案:

答案 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

中还有Jackson 2.x支持

答案 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>