【问题标题】:Restful service argument mismatch exceptionRestful 服务参数不匹配异常
【发布时间】:2015-11-03 07:02:43
【问题描述】:

我有服务

@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

【问题讨论】:

  • 它说没有阅读器(提供者)。你有 JSON 提供者吗?如果没有,您应该添加它。见here。选择您的 RESTeasy 版本
  • 没有帮助,我已经添加了
  • 你添加了jar还是依赖?一个罐子是不够的。
  • @peeskillet - 添加了使用的罐子的屏幕截图
  • 点击我提供的链接。向下滚动。您将看到四个杰克逊罐子的列表。单击版本按钮,它将带您到一个页面,您可以通过单击下载按钮下载 jar。下载所有四个并添加它们。如果它仍然不起作用,请告诉我。您可能还需要显式注册提供程序。

标签: java json web-services rest


【解决方案1】:

错误信息是

找不到类型的消息正文阅读器:com.mkyong.rest.Product of content type: application/json

这意味着要么您没有可以处理 JSON 的 MessageBodyReader,要么您有一个但未注册。

在您的情况下,您拥有 resteasy-jackson-provider,但它仍然依赖于其他核心 Jackson 库,它们是

  • jackson-core-asl
  • jackson-jaxrs
  • jackson-mapper-asl
  • jackson-xc

对于您的特定版本的 resteasy-jackson-provider:2.2.1,使用的 Jackson 版本是 1.6.3。你可以下载那些罐子here。只需向下滚动并单击每个 jar 的 1.6.3 按钮,然后单击每个 jar 的 Download (JAR),并将它们添加到您的项目中。

对于不使用 RESTeasy 2.2.1 版本的其他人,您应该选择与您的 RESTeasy 版本配套的正确 Jackson 版本。你可以看到here并选择你正在使用的RESTeasy版本。

还请注意,我提供的链接适用于 Jackson 1.x 版本,因为这是 resteasy-jackson-provider 使用的版本。如果您使用的是更新的 3.x 版本的 RESTeasy,`resteasy-jackson2-provider 中还有 Jackson 2.x 支持

【讨论】:

    【解决方案2】:

    看起来“应用程序/json”无法解析

     @Consumes(MediaType.APPLICATION_JSON)
    

    确保您添加了正确的依赖项

    <dependency>
       <groupId>org.jboss.resteasy</groupId>
       <artifactId>resteasy-jackson-provider</artifactId>
       <version>3.0.13.Final</version>
    </dependency>
    

    【讨论】:

    • 我有 resteasy-jackson-provider jar 可用...仍然一样..媒体类型也没有帮助
    • 你想返回一个 JSON 对象吗?如果是这种情况,则必须添加 @Produces(MediaType.APPLICATION_JSON)
    • 问题是它无法映射方法签名(不是基于返回类型)而是基于 orgument
    猜你喜欢
    • 2018-05-09
    • 1970-01-01
    • 2011-11-17
    • 2017-06-15
    • 2022-12-24
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多