【问题标题】:How to POST a list via jersey rest client如何通过 jersey rest 客户端发布列表
【发布时间】:2016-05-27 12:13:49
【问题描述】:

我有以下域类

public class Team {
  private String name;

  // getters and setters
]

我有以下服务端点

@Path("team")
public class TeamEndpoint {
    @Post
    @Path("registerAll")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public String register(List<Team> teams) {
       // do something
       return "Fine";
    }

    @Post
    @Path("register")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.TEXT_PLAIN)
    public String register(Team team) {
       // do something
       return "Fine";
    }
}

当我现在尝试使用 Jersey 客户端 (2.23) 时,我可以使用 Entity.json(new Team()) 发布到接受一个元素的方法 - 一切都按预期工作

但是当我用Entity.json(Arrays.asList(new Team()) 调用registerAll 时,我得到了

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.ws.rs.BadRequestException: HTTP 400 Bad Request
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:1011)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:819)
    at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:92)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:701)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:697)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:448)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:349)

如何通过 Jersey 客户端发布对象列表?

==== 编辑 ====

Jersey 客户端代码如下所示

private static String postList(List<Team> data) {       
    return ClientBuilder.newBuilder().register(JacksonFeature.class).build()
       .target("http://server/team/registerAll)
       .request(MediaType.APPLICATION_JSON)
       .post(Entity.json(data),String.class);
}

我认为这是因为 Entity.json 接受 T 而不是 List&lt;T&gt; 并且我预计需要一个 GenericType 左右 - 但我找不到任何接受这个的方法。

【问题讨论】:

  • 您也可以添加您的 Jersey 客户端代码吗?可能会有所帮助
  • 另外,您是拨打PUT 还是POST?您的代码显示 POST 但问题标题显示 PUT?
  • 我将发布代码 - 抱歉混淆了这两个...我的意思是 POST
  • 在帖子中添加客户端代码作为编辑
  • 啊 - 我找到了罪魁祸首 - 在域类中我有一个构建器,因此只有一个私有构造器(很遗憾我没有在这里显示,对此感到抱歉)。

标签: java json rest jersey


【解决方案1】:

我找到了罪魁祸首。

我的域类是由构建器创建的,因此有一个私有构造器。这引发了问题。提供公共构造函数解决了这个问题。

单个对象示例的工作原理实际上是在另一个具有公共构造函数的域类上测试的。因为我没有看到联系,所以想在这里简化描述 - 我只展示了一个域类

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    相关资源
    最近更新 更多