无法将JSON对象发送到Rest Web服务

我有一个REST Web服务配置如下:

@Path("/users") public class UserManager { @Context UriInfo uriInfo; @POST @Consumes("application/json") public void createUser(User user) { URI uri = uriInfo.getAbsolutePathBuilder().path(user.getUserName()) .build(); Response res = Response.created(uri).build(); try { MongoDbDataAccess.getInstance().addUser(user); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

我的Tomcat服务器配置如下:

  Jersey REST Service com.sun.jersey.spi.container.servlet.ServletContainer  com.sun.jersey.config.property.packages anyq.server.anyq.manager  1   Jersey REST Service /rest/*  

我创建的POJO如下所示:

 @XmlRootElement public class User { private long userId; private String userName; private String userPassword; public User() { super(); } public User(long userId, String userName, String userPassword) { super(); this.userId = userId; this.userName = userName; this.userPassword = userPassword; } public long getUserId() { return userId; } public void setUserId(long userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } 

}

我创建了一个测试客户端,以便测试createUser方法:

 public class tester { public static void main(String[] args) throws UnknownHostException { String USER_URI = "http://localhost:8080/AnyAppserver/rest/users"; User user = new User((long) 451, "mosssi", "464asd64"); Client client = Client.create(); WebResource r = client.resource(USER_URI); ClientResponse response = r.accept(MediaType.APPLICATION_JSON).post( ClientResponse.class, user); } 

但是我收到以下错误:

 POST http://localhost:8080/AnyAppserver/rest/users returned a response status of 415 Unsupported Media Type 

奇怪的问题是,当我将所有内容更改为appliction / xml时,它可以完美地运行

任何想法为什么Json不适合我?

你在做:

 User user = new User((long) 451, "mosssi", "464asd64"); ClientResponse response = r.accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, user); 

这是不对的。 您应该向您的服务发送一个真正的JSON字符串。

获取JSON解析器,例如:gson,并执行以下操作:

 User user = new User(451, "mosssi", "464asd64"); String request = gson.toJson(user); ClientResponse response = r.type(MediaType.APPLICATION_JSON).post(ClientResponse.class, request ); 

不要使用旧的Jersey-bundle库。 下载2.0版本: https : //jersey.java.net/download.html

将所有库(lib和ext库)添加到类路径中。

接下来,您需要在类路径中使用jackson包:jackson-annotations-2.2.2.jar jackson-core-2.2.2.jar jackson-databind-2.2.2.jar jackson-jaxrs-base-2.2.1.jar jackson -jaxrs-json-provider-2.2.1.jar jackson-module-jaxb-annotations-2.2.2.jar

您的服务类应该与此类似:

 package anyq.server.anyq.manager; import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import anyq.server.common.bean.User; @Path("/users") public class AnyQUserManager { @Context UriInfo uriInfo; @POST @Consumes(MediaType.APPLICATION_JSON) public Response createUser(User user) { System.out.println("HELLO WORLD"); return Response.status(666).entity("Hello world").build(); } } 

最后,您的web.xml应如下所示:

   Jersey REST Service org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages anyq.server.anyq.manager, com.fasterxml.jackson.jaxrs.json  1   Jersey REST Service /rest/*  

在您的客户端类中,执行以下操作:

  String USER_URI = "http://localhost:8080/AnyQserver/rest/users"; User user = new anyq.server.common.bean.User(); user.setUserId(15); user.setUserName("asd"); user.setUserPassword("asd"); Client client = Client.create(); String request = new Gson().toJson(user); System.out.println(request); WebResource r = client.resource(USER_URI); ClientResponse response = r.type(MediaType.APPLICATION_JSON).post( ClientResponse.class, request); System.out.println(response.getStatus()); 

重启服务器并运行客户端。 如果一切顺利,服务器应该打印:

 INFO: Server startup in 2256 ms HELLO WORLD 

和客户:

 {"userId":15,"userName":"asd","userPassword":"asd"} 666 

祝你好运!

另外,我真的很想你迁移到maven。