JAXB `@XmlJavaTypeAdapter` not working in conjunction with `java.util.Optional`
まだ誰も着手していません。
評価
調査の方向性
提供された OptionalWithTypeAdapterTest とその XmlMapper のセットアップから始め、TestObject1 と TestObject3 を比較します。無効化されている writeValueAsStringWithTypeAdapterAndOptional テストを実行し、JakartaXmlBindAnnotationModule と Jdk8Module が Optional のアダプターをどのように処理するかを調べます。テストを有効化でき、期待される小文字の XML 値で成功すれば完了です。
索引モデルが issue の本文から書いたものです。
説明
@XmlJavaTypeAdapter doesn't seem to work in conjunction with JDK's Optional class. I have written a unit test in order to replicate this issue:
package org.example;
import static org.example.OptionalWithTypeAdapterTest.TestEnum.A;
import static org.junit.jupiter.api.Assertions.assertEquals;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationModule;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.adapters.XmlAdapter;
import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class OptionalWithTypeAdapterTest {
public enum TestEnum {
A
}
public static class TestEnumAdapter extends XmlAdapter<String, TestEnum> {
@Override
public TestEnum unmarshal(String aString) {
return TestEnum.valueOf(aString.toUpperCase());
}
@Override
public String marshal(TestEnum testEnum) {
return testEnum.name().toLowerCase();
}
}
public record TestObject1(
@XmlElement @XmlJavaTypeAdapter(TestEnumAdapter.class) TestEnum testEnum) {
}
public record TestObject2(
@XmlElement Optional<TestEnum> testEnum) {
}
public record TestObject3(
@XmlElement @XmlJavaTypeAdapter(TestEnumAdapter.class) Optional<TestEnum> testEnum) {
}
private XmlMapper xmlMapper;
@BeforeEach
public void setUp() {
xmlMapper = new XmlMapper();
xmlMapper.registerModule(new JakartaXmlBindAnnotationModule());
xmlMapper.registerModule(new Jdk8Module());
}
@Test
public void writeValueAsStringWithTypeAdapter() throws JsonProcessingException {
TestObject1 testObject = new TestObject1(A);
String actual = xmlMapper.writeValueAsString(testObject);
String expected = "<TestObject1><testEnum>a</testEnum></TestObject1>";
assertEquals(expected, actual);
}
@Test
public void writeValueAsStringWithOptional() throws JsonProcessingException {
TestObject2 testObject = new TestObject2(Optional.of(A));
String actual = xmlMapper.writeValueAsString(testObject);
String expected = "<TestObject2><testEnum>A</testEnum></TestObject2>";
assertEquals(expected, actual);
}
/**
* This test fails
*/
@Disabled
@Test
public void writeValueAsStringWithTypeAdapterAndOptional() throws JsonProcessingException {
TestObject3 testObject = new TestObject3(Optional.of(A));
String actual = xmlMapper.writeValueAsString(testObject);
String expected = "<TestObject3><testEnum>a</testEnum></TestObject3>";
assertEquals(expected, actual);
}
}
This doesn't seem to have anything to do with the fact that I'm using records. I tried the same test with plain classes and the third test still fails. I'm using java 17 and jackson 2.15.0-rc1.
- 主要言語
- Java
- スター
- 636
- フォーク
- 250
- 平均マージ
- 7時間 10分
- マージ済み PR(30日)
- 8
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
FasterXML/jackson-dataformat-xml のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 55/100
-
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
FasterXML/jackson-dataformat-xml#931 · コメント 3 件 ·
-
XmlMapper with `FAIL_ON_UNKNOWN_PROPERTIES` fails on whitespace-only element対応中かも @arimu1 が 89 日前に担当しました。 オープンto-evaluate
難易度 3/5 1〜2日 初心者へのやさしさ 68/100
-
3.x
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
FasterXML/jackson-dataformat-xml#787 · コメント 1 件 ·
FasterXML/jackson-dataformat-xml の issue をすべて見る
似ている issue
-
Cleanup: restore the interrupt flag in AiFailureAnalyzer対応中かも @Rishankgupta08 が今日担当しました。 オープンgood first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
seleniumboot/selenium-boot#258 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
dense-analysis/ale#5181 ·
-
bug subsystem:agent-harness triage
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
ShaftHQ/SHAFT_ENGINE#8043 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
johanhaleby/occurrent#1505 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信