2016-09-08 16 views
13

私はジャクソンとロンボクを組み合わせて実験しています。それらは私のクラスです:ジャクソンとロンボクが一緒に働くことはできません

は、私はNetbeansのとそれをコンパイルしています(私はこれが本当に関連しているとは思わないが、私はこれを報告していますとにかくそれを完全かつ忠実に再現可能にする)。上記の5つのJARファイルは、プロジェクトフォルダ内の "lib"というフォルダに保存されています( "src"、 "nbproject"、 "test"、 "build")。プロジェクトプロパティで「Add JAR/Folder」ボタンを使用してNetbeansに追加しました。これらのボタンは、上記のリストと同じ順序で表示されます。このプロジェクトは、標準的な "Javaアプリケーション"タイプのプロジェクトです。

さらに、NetBeansプロジェクトは、 "情報をデバッグ生成"、 "保存をコンパイルしない" に設定され、 "トラックJavaの依存関係"、 "activacte注釈 "レポートはAPIのを非推奨しました" 「を処理しています」、「編集者」が有効になっています。注釈プロセッサーまたは注釈処理オプションは、Netbeansで明示的に構成されていません。また、 "-Xlint:all"コマンドラインオプションはコンパイラコマンドラインで渡され、コンパイラは外部VM上で実行されます。

javacのバージョンは1.8.0_72で、Javaのバージョンは1.8.0_72-b15です。私のネットビーンズは8.1です。

私のプロジェクトは正常にコンパイルされます。ただし、実行時に例外がスローされます。例外は、簡単にまたは明らかに修正可能に見えるものではないようです。ここでスタックトレースを含む出力は、次のとおりです。

TestFoo(x=b, z=5) 
{"z":5,"xoom":"a"} 
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface [email protected]es(value=[x, z]), interface [email protected]son.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator 
at [Source: {"z":5,"xoom":"a"}; line: 1, column: 1] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:296) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) 
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:475) 
    at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3890) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3785) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833) 
    at testelombok.TestLombok.main(TestLombok.java:14) 
Caused by: java.lang.IllegalArgumentException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface [email protected]es(value=[x, z]), interface [email protected]son.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator 
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addDeserializerConstructors(BasicDeserializerFactory.java:511) 
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:323) 
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:253) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:219) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:141) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:406) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352) 
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) 
    ... 7 more 

私はすでに@Value@AllArgsConstructor注釈を突っついについてランダムに試してみましたが、私は任意のより良いそれを作ることができませんでした。

私はgoogle'd例外とfound an old bug report on jacksonanother one that is open, but seems to be related to something elseです。しかし、これはまだ何がこのバグか、それを修正する方法について何も教えていない。また、私はどこか他の場所を探すのに役立つものは見つけられませんでした。

私はロンボクとジャクソンの両方の非常に基本的な使い方をしているので、この問題を回避する方法については、これ以上役に立つ情報は見つけられませんでした。多分私は何かを忘れた?

単に「 はロンボクを使用していない」と言っ以外

か、誰もがこの問題を解決する方法についてのアイデアを持っているか、「はジャクソンを使用していませんか」?

答えて

1

"mixin" patternを使用すると、ジャクソンには何でも遊べます。基本的には、実際にそのクラスを変更することなく、既存のクラスにJackson注釈を追加する方法を提供します。私は、JacksonがJacksonの特徴を持っている問題を解決するので、ロンボクの解決策ではなく、ここでそれを推薦することに傾いているので、長期的に働く可能性が高くなります。

4

私は(あなたの例を使用して)suppressConstructorProperties = trueパラメータを追加することで、それを「解決」、まったく同じ問題を持っていた:

@Value 
@Wither 
@AllArgsConstructor(suppressConstructorProperties = true) 
public class TestFoo { 
    @JsonProperty("xoom") 
    private String x; 
    private int z; 
} 

ジャクソンは明らかにコンストラクタに追加java.beans.ConstructorProperties注釈が好きではありません。 suppressConstructorProperties = trueパラメータは、Lombokに追加しないように指示します(デフォルトで設定します)。それは年の少なくとも、カップルのためのすべてのロンボク島とジャクソンのバージョンで働いていた

@JsonAutoDetect(fieldVisibility = Visibility.ANY) 
@JsonInclude(JsonInclude.Include.NON_DEFAULT) 
@Data 
@Accessors(fluent = true) 
@NoArgsConstructor 
@AllArgsConstructor 

+3

'suppressConstructorProperties'が今ソリューションへのリンクは大歓迎です – lilalinux

0

私はこのような注釈付きのすべての私のクラスをしました。

例:

@JsonAutoDetect(fieldVisibility = Visibility.ANY) 
@JsonInclude(JsonInclude.Include.NON_DEFAULT) 
@Data 
@Accessors(fluent = true) 
@NoArgsConstructor 
@AllArgsConstructor 
public class Person { 
    String id; 
    String first; 
    String last; 
} 

そして、それはそれです。 ロンボクとジャクソンは一緒に魅力的な遊びをしています。

0
@JsonInclude(JsonInclude.Include.NON_NULL) 
@Data 
public class Person { 
    String id; 
    String first; 
    String last; 
} 

データクラスに加えて、ObjectMapperが正しく構成されている必要があります。この場合 、それはParameterNamesModule構成で[OK]を働いている、そして予想通り、それが動作するはずフィールドとCreator方法

om.registerModule(new ParameterNamesModule()); 
    om.setVisibility(FIELD, JsonAutoDetect.Visibility.ANY); 
    om.setVisibility(CREATOR, JsonAutoDetect.Visibility.ANY); 

の可視性を設定します。

2

@AllArgsConstructor(suppressConstructorProperties = true)は推奨されていません。 lombok.anyConstructor.suppressConstructorProperties=truehttps://projectlombok.org/features/configuration)を定義し、POJOのロンボクの注釈を@Valueから@Data + @NoArgsConstructor + @AllArgsConstructorに変更してください。

-1

ロンボクとジャクソンを使用して、不変ですが、jsonのシリアライズ可能なPOJOが必要な場合。 lomboks builderでjacksonの新しい注釈を使用@JsonPOJOBuilder(withPrefix = "") 私はこのソリューションを試してみました。 使用例

import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 
    import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; 
    import lombok.*; 

    @JsonDeserialize(builder = Detail.DetailBuilder.class) 

    @Value 

@Builder 
public class Detail { 

    private String url; 
    private String userName; 
    private String password; 
    private String scope; 

    @JsonPOJOBuilder(withPrefix = "") 
    public static class DetailBuilder { 

    } 
} 
+0

:-(推奨されていませんが、あなたの答えはそれなしに有用であることを確認してください:[リンクの周りのコンテキストを追加](// meta.stackexchange .com/a/8259)あなたの仲間のユーザーは、それが何であるか、なぜそれがあるのか​​をいくつか考えて、ターゲットページが利用できない場合にリンクしているページの最も関連性の高い部分を引用します。複数のリンクが削除されることがあります。](// stackoverflow。com/help/deleted-answers) – geisterfurz007

+0

このリンクは質問に答えるかもしれませんが、回答の重要な部分をここに含めて参考にしてください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューから](/レビュー/低品質の投稿/ 18828665) – JimHawkins

+1

リンクを削除して、私の作業サンプルを追加しました –

関連する問題