私はJersey 2.0でJackson jsonプロバイダーを使用しています。次のような Web リソースがあります。
@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"}
残念ながら、Jackson プロバイダーは上記の JSON をデシリアライズしません。null の UserCredentials オブジェクトが、上記の Web リソースの POST メソッドに挿入されます。カスタム MessageBodyReader を使用すると、Reader の readFrom メソッドが呼び出され、POST メソッドで使用できる UserCredentials pojo を作成できます。
いくつかの質問:
1) Jackson が Pojo を認識できるようにするには、Pojo に特別な注釈を付ける必要がありますか? Pojo のパッケージを web.xml に追加する必要がありますか?
2) "com.sun.jersey.api.json.POJOMappingFeature" という web.xml のプロパティはもう関係ありますか?
3) ObjectMapper を追加する必要がありますか? カスタムの場合のみでいいと思いますが、アドバイスお願いします。
3) 他に落とし穴は?? Jackson でコードをデバッグする方法はありますか?
ありがとう。