2016-09-09 6 views
1

私はちょうど1.3.2から1.4へのスプリングブートを更新し、結果として2.6.5を2.8.1に更新しました。Jacksonは2.8.1へのアップデート以来、すべての引数コンストラクタを使用しようとしています

その他のコードの変更なしで、jacksonは通常の引数なしコンストラクタ(AnnotatedConstructor.java:120)の代わりにall-args-constructor(AnnotatedConstructor.java:124)を使用してモデルクラスのインスタンスを作成しようとします。 。

ジャクソンが、これは例外が発生(ロングのための文字列を設定する)間違った順序でコンストラクタを使用しているので:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.example.PoJO, problem: argument type mismatch 
at [Source: [email protected]; line: 1, column: 1138] 
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:268) 
at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1405) 
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.wrapAsJsonMappingException(StdValueInstantiator.java:468) 
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.rewrapCtorProblem(StdValueInstantiator.java:487) 
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:276) 
at com.fasterxml.jackson.databind.deser.ValueInstantiator.createFromObjectWith(ValueInstantiator.java:224) 
at com.fasterxml.jackson.databind.deser.impl.PropertyBasedCreator.build(PropertyBasedCreator.java:135) 
at com.fasterxml.jackson.databind.deser.impl.ExternalTypeHandler.complete(ExternalTypeHandler.java:225) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeUsingPropertyBasedWithExternalTypeId(BeanDeserializer.java:937) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeWithExternalTypeId(BeanDeserializer.java:792) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:312) 
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:148) 
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3789) 
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2913) 
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:225) 
... 52 common frames omitted 
Caused by: java.lang.IllegalArgumentException: argument type mismatch 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
at com.fasterxml.jackson.databind.introspect.AnnotatedConstructor.call(AnnotatedConstructor.java:124) 
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromObjectWith(StdValueInstantiator.java:274) 
... 62 common frames omitted 

私は私のコードへの変更をしなかったので、私はどこから始めには考えていますデバッグ私は2.6.5にジャックソンを修正することでこの問題が解決されることを確認しました。

なぜjacksonはall-args-constructorを使用しようとしていますか?no-args-constructorを強制的に使用する方法はありますか?

+1

あなたはロンボクを使用して、任意の偶然か?そうであれば、デフォルトで '@ ConstructorProperties'を追加する傾向があります。これは、Jacksonによって@JsonCreatorと同様に解釈され、注釈付きコンストラクタを実際に使用する必要があることを示しています。しかし、アノテーションを追加しないように、その動作を設定することができます。 – StaxMan

答えて

0

ジャクソンの注釈を見ると、私はあなたが明示的に何の引数のコンストラクタを使用することができなかったと思います:

public class YourPojo { 
    @JsonCreator 
    public YourPojo(){} 
} 
+0

これを試してみましたが、動作しません。 – Laures

0

私はこの答えのミックスを使用していた:how to specify jackson to only use fields - preferably globally

@StaxManさんのコメントに感謝:

万が一Lombokを使用していますか?
もしそうなら、それは自動JsonCreator自動検出を削除し、デシリアライズしたオブジェクトに@JsonCreator


に似ジャクソンによって解釈され、デフォルトで@ConstructorPropertiesを追加する傾向がある:

@Value 
@AllArgsConstructor 
// Add a private default constructor used through reflection 
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true) 
// Deactivate JsonCreator auto detection 
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE, creatorVisibility = Visibility.NONE) 
public class ValueObject { 

    @NotEmpty 
    private String x; 
} 

ロンボクさん@AllArgsConstructorでは、suppressConstructorPropertiesを上書きすることはできません。あなたのlombok.configファイルで

、追加します。

lombok.anyConstructor.suppressConstructorProperties=true 
関連する問題