0

我在将一些 JSON 发布到使用 Jersey REST 构建的 Web 服务时遇到问题。数据似乎永远不会到达服务器。

整个任务流程有点像这样:

Javascript POST JSON -> Webserver -> webserver 获取 JSON 并打印出来

这是应该将 JSON 数据发布到服务器的 Javascript,其路径为/posttest

<script type="text/javascript">
$(function() {
    var name = "Tony";
    $.post(
            '/posttest',

            function (data) {
                alert("sune " + data.name);
            });
})
 </script>

我有一个运行所有这些类的网络服务器(Grizzly):

此类使用 JAX-RS API 来处理使用 JSON 数据的 POST 请求:

@Path("/posttest")
public class PostTest {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response doPost(StatusBean b) {
    System.out.println("---> " + b.getName());
    StatusBean statusBean = new StatusBean();
    return Response.status(Response.Status.ACCEPTED).entity(statusBean).build();
}

这是数据将被序列化到和从中的 bean 的定义:

@XmlRootElement
public class StatusBean {
   private String name;

   public StatusBean() {
   }

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name= name;
   }
}

这是在控制台中打印出数据的测试客户端类

ClientConfig cc = new DefaultClientConfig();
Client c = Client.create(cc);
WebResource r = c.resource("http://localhost:9998/posttest");
StatusBean post = r.type(MediaType.APPLICATION_JSON_TYPE).post(StatusBean.class, new StatusBean());
System.out.println("--> " + post.getName());
4

2 回答 2

0

我只有resteasy而不是jersey的经验,但我会尝试依赖JAX-RS标准。

发生此类错误时,您应该始终更详细地调查 HTTP 响应。在浏览器中打开网络监视器并检查 HTTP 响应代码。我认为你得到一个 405,因为你发送的 JSON 和 StatusBean java 对象不匹配。你的java bean有一个'dat'属性,而你的JSON有一个'name'属性。

还要确保您像 javascript 一样直接序列化 java 对象。这可以使用杰克逊序列化器来实现。要使用它,只需将它包含在您的类路径中。Usgin maven 这可能是:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.8</version>
</dependency>

此链接可能会有所帮助:http ://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

于 2012-04-19T12:04:00.050 回答
0

您的 StatusBean 应该有名为的字段name,而不是 dat - 它应该与{"name":"Tony"}.

顺便提一句。RESTEasy servlet 的 REST 资源映射是什么?在上面的设置中应该是/*.

于 2012-04-19T11:36:41.493 回答