私はジャクソンとロンボクを組み合わせる実験をしています。それらは私のクラスです:
package testelombok;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Value;
import lombok.experimental.Wither;
@Value
@Wither
@AllArgsConstructor(onConstructor=@__(@JsonCreator))
public class TestFoo {
@JsonProperty("xoom")
private String x;
private int z;
}
package testelombok;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.xebia.jacksonlombok.JacksonLombokAnnotationIntrospector;
import java.io.IOException;
public class TestLombok {
public static void main(String[] args) throws IOException {
TestFoo tf = new TestFoo("a", 5);
System.out.println(tf.withX("b"));
ObjectMapper om = new ObjectMapper().setAnnotationIntrospector(new JacksonLombokAnnotationIntrospector());
System.out.println(om.writeValueAsString(tf));
TestFoo tf2 = om.readValue(om.writeValueAsString(tf), TestFoo.class);
System.out.println(tf2);
}
}
これらは、私がクラスに追加しているJARです。
Lombok:https://projectlombok.org/downloads/lombok.jar(バージョン1.16.10)
ジャクソンアノテーション:http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar
ジャクソンコア:http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.8.2/jackson-core-2.8.2.jar
Jackson databind:http://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.8.2/jackson-databind-2.8.2.jar
Jackson-lombok:http://repo1.maven.org/maven2/io/paradoxical/jackson-lombok/1.1/jackson-lombok-1.1.jar
私はそれをNetbeansでコンパイルしています(これは本当に関連性があるとは思いませんが、完全かつ忠実に再現できるようにするためにとにかくこれを報告しています)。上記の5つのJARはlib
、プロジェクトフォルダー内の「」というフォルダーに(「src
」、「nbproject
」、「test
」、「」とともにbuild
)保持されます。プロジェクトプロパティの[ JAR /フォルダの追加]ボタンを使用してNetbeansに追加しましたが、上記のリストとまったく同じ順序でリストされています。このプロジェクトは、標準の「Javaアプリケーション」タイプのプロジェクトです。
さらに、Netbeansプロジェクトは、「保存時にコンパイルしない」、「デバッグ情報を生成する」、「非推奨のAPIを報告する」、「Javaの依存関係を追跡する」、「アクティブ化アノテーション処理」、「エディタでアクティブ化アノテーション処理」するように設定されています。Netbeansでは、注釈プロセッサまたは注釈処理オプションは明示的に設定されていません。また、 " -Xlint:all
"コマンドラインオプションはコンパイラコマンドラインで渡され、コンパイラは外部VMで実行されます。
私のjavacのバージョンは1.8.0_72で、私のjavaのバージョンは1.8.0_72-b15です。私のNetbeansは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 java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.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 java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.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
アノテーションを使ってランダムに突くように試みましたが、これ以上改善することはできませんでした。
私は例外をグーグルで検索し、jacksonに関する古いバグレポートと、開いているが他の何かに関連しているように見える別のバグレポートを見つけました。ただし、これでも、このバグとは何か、またはその修正方法については何もわかりません。また、他の場所でそれを探すのに役立つものは何も見つかりませんでした。
私がやろうとしているのは、ロンボクとジャクソンの両方の非常に基本的な使用法であるため、この問題を回避する方法についてこれ以上役立つ情報を見つけることができなかったのは奇妙に思えます。多分私は何かを逃したのですか?
「ロンボクを使わない」や「ジャクソンを使わない」と言う以外に、これを解決する方法を知っている人はいますか?