2016-12-21 12 views
1

要するに、私は書いたレストサービスに対して安心してインテグレーションテストを作成しようとしています。私の問題は、サーバーがJSONを逆シリアル化しようとすると、フィールド「メタデータ」が無視できないとマークされているエラーが発生するということです。私はこのフィールドを処理しなければなりません。これは私の知る限り、私はそれを無視できるものとしてマークすることはできません。はい、私は "それをもう一度やり直しました"。 Apacheを無効にし、手動で私の戦争を削除し、ファイルを展開し、再展開し、内容を調べてアップデートを確認し、サーバーを再起動しました。JsonPropertyはシリアライズしますが、デシリアライズしません

免責事項:私はバージョンをアップグレードしないかもしれませんが、私はダウングレードする可能性があります。たとえば、Jackson 2.0ではなくJackson 1.0を使用できます。私は簡潔さのために私の問題を簡素化しました。私はJSONの構造を変更することはできません。私は春に関連する同様のスレッドを見ましたが、私は春を使用していません。

これは単なるJSONオブジェクト全体の断片です。私がメタデータとその2つの属性を働かせることができれば、私が学んだことを残りの問題に適用することができます。ありがとう!

マイJSON

{ 
    "meta-data" : { 
    "submission-time" : "06.12.2016", 
    "workflow-reference" : "TEST-WORKFLOW" 
    } 
} 

マイJSON POJO

package com.company.group.project.module.shared.json; 
import com.fasterxml.jackson.annotation.JsonFormat; 
import com.fasterxml.jackson.annotation.JsonFormat.Feature; 
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.databind.annotation.JsonSerialize; 
import java.util.List; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class JsonMandateRequest { 

    @JsonProperty("meta-data") 
    private MetaData metadata; 

    public MetaData getMetadata() { 
     if (null == metadata) { 
      metadata = new MetaData(); 
     } 
     return metadata; 
    } 

    public void setMetadata(final MetaData metadata) { 
     this.metadata = metadata; 
    } 

    @JsonSerialize 
    public static class MetaData { 

     @JsonProperty("submission-time") 
     private String timestamp; 

     @JsonProperty("workflow-reference") 
     private String workflow; 

     public String getTimestamp() { 
      return timestamp; 
     } 

     public void setTimestamp(final String timestamp) { 
      this.timestamp = timestamp; 
     } 

     public String getWorkflow() { 
      return workflow; 
     } 

     public void setWorkflow(final String workflow) { 
      this.workflow = workflow; 
     } 

    } 
} 

私のRESTサービスの宣言(私はパスが動作する知っている。それが壊れているものではありません。)

ここ
@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN}) 
public Response uploadFile(final JsonMandateRequest reminders) { 
    return buildResponse(reminders, PROCESSOR_UPLOAD_MANDATE); 
} 

私のJSON文字列を生成するコードです。それは動作しますが、何らかの形で読者に利益をもたらす場合に備えて私はそれを含めています。

public static String writeObject(final Object obj) throws IOException 
{ 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper = mapper.disable(
      DeserializationFeature.FAIL_ON_INVALID_SUBTYPE); 
    return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); 
} 

私の統合テストコードスニペット

Response r = given() 
      .contentType(ContentType.JSON) 
      .body(jsonString) 
      .when().post(url); 
    System.out.println("Response from " + url + "(" + r.getStatusCode() + ")"); 
    System.out.println(r.asString()); 

出力:

Response from http://localhost:8080/application/rest/path(400) 
Unrecognized field "meta-data" (Class com.company.group.project.module.shared.json.JsonMandateRequest), not marked as ignorable 
at [Source: [email protected]; line: 2, column: 18] (through reference chain: com.company.group.project.module.shared.json.JsonMandateRequest["meta-data"]) 
Completed com.company.group.project.module.services.rest.InstructionServiceIT#testLifecycle(InstructionServiceIT.java:95) 

私のサーブレットコンテナは、ここでのTomcat 7.0.73 ある他のバージョンを示して私のpom.xmlからの抜粋です私が使っているソフトウェアの

<dependency> 
    <groupId>javax.servlet</groupId> 
    <artifactId>javax.servlet-api</artifactId> 
    <version>3.0.1</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-json</artifactId> 
    <version>1.9.1</version> 
</dependency> 
<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>1.9.1</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.8.3</version> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.8.3</version> 
</dependency> 
+0

これはjersey-jsonプロバイダを削除するのと同じくらい簡単です。 jackson-jaxrs-json-providerはjacksonプロバイダを登録します。これは、ジャージバージョンの不一致の問題かもしれません。 –

+0

jersy-json依存関係を削除した後、com.fasterxml.jackson.jaxrs.json.JacksonJsonProviderを手動で登録する必要があります。 –

+0

@ChrisHinshawありがとう!バージョンミスマッチの問題でした。 –

答えて

1

正しい方向に私を指してくれたChris Hinshawに感謝します。私が使用しているジャージーのバージョンは、使用しているジャクソンのバージョンをサポートしていません。私はジャージーの新しいバージョンにステップアップすることができないので、ジャクソン2からジャクソン1に降格する必要がありました。 私は古いものを残して、読者の利益のためにコメントアウトしました。

<!--<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.8.3</version> 
    </dependency> 
    <dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.8.4</version> 
    </dependency>--> 
    <dependency> 
    <groupId>org.codehaus.jackson</groupId> 
    <artifactId>jackson-all</artifactId> 
    <version>1.9.0</version> 
    </dependency> 

明らかに、Jersey 1.9.1は少なくとも私の場合はジャクソン1.9.0と互換性があります。

JsonMandateRequestの新しいインポートは、このようになります。

import org.codehaus.jackson.annotate.JsonIgnoreProperties; 
import org.codehaus.jackson.annotate.JsonProperty; 
import org.codehaus.jackson.map.annotate.JsonDeserialize; 
import org.codehaus.jackson.map.annotate.JsonSerialize; 

関連する問題