4

私は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 でコードをデバッグする方法はありますか?

ありがとう。

4

3 に答える 3

0

何が悪いのか考えました。Request を処理するために LoggingFilter を添付しました。エンティティ ストリームからエンティティを読み取っていました。したがって、ジャクソンが読み取って処理するものは何も残っていませんでした。愚かな私!

于 2013-07-11T17:06:54.937 に答える