0

RESTful サービスから返される次の JSON があります

{
    "Status": "Success",
    "Success": true,
    "Path": "D:\\Work\\Sites\\EKSites\\OnTrek\\privateassets\\0\\155\\156\\ceb3dc64-33ed-4e96-80a2-846120ecd9ee.pdf",
    "Timestamp": "2013-03-27T18:35:23.8997358-04:00"
}

JSON をこのデータ クラスに逆シリアル化しようとしています。

package ektron.cms.jdbc.extractors;

@JsonPropertyOrder({ "Status", "Success", "Path", "Timestamp" })
public class AssetDataResponse {

    @JsonProperty("Status")
    private String Status;

    @JsonProperty("Success")
    private Boolean Success;

    @JsonProperty("Path")
    private String Path;

    @JsonProperty("Timestamp")
    private String Timestamp;

    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("Status")
    public String getStatus() {
        return Status;
    }

    @JsonProperty("Status")
    public void setStatus(String Status) {
        this.Status = Status;
    }

    @JsonProperty("Success")
    public Boolean getSuccess() {
        return Success;
    }

    @JsonProperty("Success")
    public void setSuccess(Boolean Success) {
        this.Success = Success;
    }

    @JsonProperty("Path")
    public String getPath() {
        return Path;
    }

    @JsonProperty("Path")
    public void setPath(String Path) {
        this.Path = Path;
    }

    @JsonProperty("Timestamp")
    public String getTimestamp() {
        return Timestamp;
    }

    @JsonProperty("Timestamp")
    public void setTimestamp(String Timestamp) {
        this.Timestamp = Timestamp;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperties(String name, Object value) {
        this.additionalProperties.put(name, value);
    }
}

以下は私のクライアントコードです:

package ektron.common.network;
//...
ClientConfig clientConfig = new DefaultClientConfig();

clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);

clientConfig.getClasses().add(JacksonJsonProvider.class);
client = Client.create(clientConfig);

WebResource webResource = 
    client.resource(
            String.format("http://%s:%d/%s","localhost",7605,"asset"));

String return =             
webResource
    .path("3f7078c4")
    .path("ceb3dc64-33ed-4e96-80a2-846120ecd9ee")
    .accept(MediaType.APPLICATION_JSON)
    .get(String.class); //This piece works and I get my JSON response as 
                        //indicated above

しかし、上記を次のように変更すると:

AssetDataResponse resp = 
        webResource
            .path("3f7078c4")
            .path("ceb3dc64-33ed-4e96-80a2-846120ecd9ee")
            .accept(MediaType.APPLICATION_JSON)
            .get(AssetDataResponse.class); 

次のエラーが表示されます。

認識されないフィールド「ステータス」(クラス ektron.cms.jdbc.extractors.AssetDataResponse)、無視可能としてマークされていません

逆シリアル化を正しく機能させるために必要な ClientConfig の構成はありますか? これに関するヘルプは非常に高く評価されます。私は .NET 開発者で Java を初めて使用し、Jersey フレームワークにはあまり詳しくありません。同様の質問からの回答を既に確認しましたが、私のケースはそこに記載されているケースとは異なります。

クライアント側の Jar

  • 注釈-1.3.9.jar
  • asm-3.1.jar
  • コードモデル-2.4.1.jar
  • ジャクソン-注釈-2.1.2.jar
  • jackson-core-2.1.3.jar
  • jackson-core-asl-1.9.11.jar
  • jackson-databind-2.1.3.jar
  • ジャクソン-jaxrs-1.9.2.jar
  • ジャクソン-マッパー-asl-1.9.11.jar
  • jackson-xc-1.9.2.jar
  • jcommander-1.30.jar
  • jersey-apache-client-1.17.jar
  • jersey-atom-abdera-1.17.jar
  • jersey-client-1.17.jar
  • jersey-core-1.17.jar
  • jersey-guice-1.17.jar
  • jersey-json-1.17.jar
  • jersey-multipart-1.17.jar
  • jersey-server-1.17.jar
  • jersey-servlet-1.17.jar
  • jettison-1.1.jar
  • jsr311-api-1.1.1.jar
  • 検証-api-1.0.0.GA.jar
4

1 に答える 1

0

問題を解決しました。問題は、「Perception」が示したように、Jackson ライブラリの両方のバージョンからクラスをインポートしていたことです。Jackson ライブラリの最新の安定バージョンを Jersey クライアントで使用できるようになりました。

ご提案いただきありがとうございます。

私のクライアントコードは次のようになります。

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;

...
    /**
 * Wrapper class for a RESTful Service
 */
public class RestServiceWrapper
{


    public ResponseData performRequest(
                List<String> reqArgs,
                ResponseType rType,
                Class<?> dataType
                )
    {
        ResponseData data = new ResponseData();

        for(String arg: nullCheck(reqArgs))
        {
            if(StringUtils.isNotEmpty(arg))
            {
                webResource=webResource.path(arg);
            }
        }
        data.data = webResource
                .accept(MediaType.APPLICATION_JSON) //For now only JSON supported
                .get(AssetDataResponse.class);
        data.rType = ResponseType.JSON;




        return data;
    }

    protected ServiceInfo svcInfo;



    public RestServiceWrapper(ServiceInfo svcInfo) {

        ClientConfig clientConfig = new DefaultClientConfig();
        clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
        clientConfig.getClasses().add(JacksonJsonProvider.class);
        client = Client.create(clientConfig);
        this.svcInfo = svcInfo;
        this.webResource = 
                client.resource(
                        String.format("http://%s:%d/%s",svcInfo.Host,svcInfo.Port,svcInfo.EndPoint));
    }

    private static <T> Iterable<T> nullCheck(Iterable<T> iterable) {
        return iterable == null ? Collections.<T>emptyList() : iterable;
    }

    protected Client client;
    protected WebResource webResource;
}

元のエラーに再び遭遇した失敗した次の行を含める必要がありました

clientConfig.getClasses().add(JacksonJsonProvider.class);

からインポートされた JacksonJsonProvider

//jackson-jaxrs-json-provider-2.1.3.jar
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;

私の瓶は今のように見えます。

annotations-1.3.9.jar
asm-3.1.jar
codemodel-2.4.1.jar
jackson-annotations-2.1.2.jar
jackson-core-2.1.3.jar
jackson-databind-2.1.3.jar
jackson-jaxrs-json-provider-2.1.3.jar
jcommander-1.30.jar
jersey-apache-client-1.17.jar
jersey-atom-abdera-1.17.jar
jersey-client-1.17.jar
jersey-core-1.17.jar
jersey-guice-1.17.jar
jersey-json-1.17.jar
jersey-multipart-1.17.jar
jersey-server-1.17.jar
jersey-servlet-1.17.jar
jettison-1.1.jar
jsonschema2pojo-core-0.3.5.jar
jsr311-api-1.1.1.jar
validation-api-1.0.0.GA.jar
于 2013-03-29T16:47:51.010 に答える