2016-12-20 10 views
2

Java 8のParameterNamesModuleでJackson 2.8.5を使用しています(https://github.com/FasterXML/jackson-modules-java8)。引数が1つのJackson単一引数コンストラクタがParameterNameModuleで失敗する

私の問題は、単一の引数を使用して単一のコンストラクタを使用してクラスをデシリアライズしたいときに、非常に特定の使用例に特有です。ここで動作を再現するテストは次のとおりです。

com.fasterxml.jackson.databind.JsonMappingException:

public class JacksonTest { 

    @Test 
    public void TestReadValue() throws IOException { 
     ObjectMapper objectMapper = new ObjectMapper() 
       .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY) 
       .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.PUBLIC_ONLY) 
       .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)); 

     ImmutableIdentity identity = objectMapper.readValue("{\"id\":\"ABCDEF\"}", ImmutableIdentity.class); 

     assertEquals("ABCDEF", identity.id); 
    } 

    private static final class ImmutableIdentity { 

     private final String id; 

     public ImmutableIdentity(final String id) { 
      Objects.requireNonNull(id, "The id must not be null."); 

      this.id = id; 
     } 
    } 

} 

テストが理由で失敗しJacksonTest $ ImmutableIdentity、問題の インスタンスを作成することはできません:IDは である必要はありません。 [出典:{"id": "ABCDEF"};行:1、列:15]

もう1つの引数をコンストラクタに追加すると、テストはOKになります。

public class JacksonTest { 

    @Test 
    public void TestReadValue() throws IOException { 
     ObjectMapper objectMapper = new ObjectMapper() 
       .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY) 
       .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.PUBLIC_ONLY) 
       .registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES)); 

     ImmutableIdentity identity = objectMapper.readValue("{\"id\":\"ABCDEF\"}", ImmutableIdentity.class); 

     assertEquals("ABCDEF", identity.id); 
    } 

    private static final class ImmutableIdentity { 

     private final String id; 

     public ImmutableIdentity(final String id, **final String unused**) { 
      Objects.requireNonNull(id, "The id must not be null."); 

      this.id = id; 
     } 
    } 

} 
それは私のビジネスオブジェクトで値を持たないので、私は本当に、特に彼らは、インスタンスPROJECTIDのためのもの、またはいくつかの抽象的な、それはあまり曖昧にするために、ここでコンストラクタで役に立たない引数を使用するためにアイデアを好きではない

私のエンティティを定義するIDと私はそれらを手動で構築する必要があります。だから私はこれをサポートするためにジャクソンの構成を見たいですが、できませんでした。

私もメンテナのためにここにクロスポスト:https://github.com/FasterXML/jackson-modules-java8/issues/8

答えて

2

あなたは-parametersオプションでJacksonTestをコンパイル万が一ていますか?もしそうなら、これは予想される動作です。 単一の引数コンストラクタは、歴史的に委任クリエータとして使用されていました。 モジュールを作成したときでも、この問題について@staxmanと議論しました。この問題はさまざまなユーザーによって何度も発生しました。詳しくはthis issueを参照してください。 将来を見て、これは3.0で変更されることを願っています。this topicを参照してください。

更新:3.0変更については、this issueを参照してください。この動作を変更するには、+1またはコメントを追加してください。今のところ、古い振る舞いを必要とするユーザーがいるため、どちらのアプローチが優れているかは明らかではありません(詳しくは、問題を参照してください)。

+0

あなたは、単一の引数のコンストラクタは、従来の動作のためあいまいであることを意味しますか?私は今理解しています、答えとそれらの議論へのリンクに感謝します。 –

+0

はい、問題ありません。 – lpandzic

関連する問題