我使用杰克逊json提供者与泽西岛2.0。我有这样的Web资源:杰克逊供应商不反序列化POST数据到Pojo(泽西岛2.0)
@Path("/accesstokens")
public class AccessTokensService {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response generate(UserCredentials creds) {
System.out.println("In generate method..");
System.out.println(creds);
try {
// Authenticate .. generate token ..
return Response.ok(token, MediaType.APPLICATION_JSON).build();
}
catch (Exception e) {
e.printStackTrace();
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
}
}
的UserCredentials POJO类如下:
public class UserCredentials {
private String username;
private String password;
private String ipAddress;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getIpAddress() {
return ipAddress;
}
public void setIpAddress(String ipAddress) {
this.ipAddress = ipAddress;
}
}
下面是web.xml中的相关片段:
<servlet>
<servlet-name>jersey-rest-service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.xxxxx.apps.ws.services;com.fasterxml.jackson.jaxrs.json;com.xxxxxx.apps.servlet;com.xxxxxx.apps.ws.filters</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.xxxxxx.apps.ws.filters.LoggingFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
这里是如何POST实体数据看起来像:
{"username":"xxxxx", "password":"xxxxxx", "ipAddress": "xxx.xxx.xxx.xxx"}
不幸的是,杰克逊提供商并未反序列化上述JSON。一个空的UserCredentials对象被注入到上面的Web资源的POST方法中。如果我使用自定义的MessageBodyReader,则会调用Reader的readFrom方法,并且可以创建UserCredentials pojo,然后在POST方法中使用它。
几个问题:
1)我需要做的POJO的任何特殊标注为杰克逊承认它? Pojo的包是否需要添加到web.xml中?
2)web.xml中的这个属性是否相关:“com.sun.jersey.api.json.POJOMappingFeature”?
3)我需要添加一个ObjectMapper吗?我认为它只需要处理定制案例,但请告知。
3)其他陷阱?有没有办法在杰克逊调试代码?
谢谢。
嗨,jackson-jaxrs-providers artifact提供的JacksonFeature?如果是的话是否有一个maven repo托管这个或者我应该从github上下载并构建一个?谢谢 – devlearn
这是在jersey-media-json-jackson。请参阅https://jersey.java.net/documentation/latest/user-guide.html#json.jackson –
即使没有在应用程序中声明JacksonFeature,它也可以使用该软件包!非常感谢。 – devlearn