1

Color を XML にマーシャリング/アンマーシャリングしようとしています。JAXB プロジェクトには、XmlJavaTypeAdapter https://jaxb.java.net/guide/XML_layout_and_in_memory_data_layout.htmlを介してこれとまったく同じことを行うためのサンプル コードがありました。

マーシャリングは正常に機能し、出力は期待どおりです。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<beanWithColor>
    <foreground>#ff0000ff</foreground>
    <name>CleverName</name>
</beanWithColor>

ただし、XML からオブジェクトに移動しようとすると、unmarshal メソッドは呼び出されません。誰でもその理由について洞察を提供できますか? 非整列化された後、前景色は null になり、非整列化が呼び出されないことをデバッガーで確認しました。

BeanWithColor{foreground=null, name='CleverName'}

SCCE:

@XmlRootElement
public class BeanWithColor {
private String name;
private Color foreground;

public BeanWithColor() {

}

public BeanWithColor(Color foreground, String name) {
    this.foreground = foreground;
    this.name = name;
}

@XmlJavaTypeAdapter(ColorAdapter.class)
public Color getForeground() {
    return this.foreground;
}

public void setForeground(Color foreground) {
    this.foreground = foreground;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Override
public String toString() {
    final StringBuilder sb = new StringBuilder("BeanWithColor{");
    sb.append("foreground=").append(foreground);
    sb.append(", name='").append(name).append('\'');
    sb.append('}');
    return sb.toString();
}

public static void main(String[] args) {
    BeanWithColor bean = new BeanWithColor(Color.blue, "CleverName");

    try {
        StringWriter writer = new StringWriter(1000);
        JAXBContext context = JAXBContext.newInstance(BeanWithColor.class);
        final Marshaller marshaller = context.createMarshaller();
        marshaller.marshal(bean, writer);
        System.out.println("Marshaled XML: " + writer);

        final Unmarshaller unmarshaller = context.createUnmarshaller();
        BeanWithColor beanWithColor = (BeanWithColor) unmarshaller.unmarshal(new StringReader(writer.toString()));
        System.out.println("beanWithColor = " + beanWithColor);
    } catch (JAXBException e) {
        e.printStackTrace();
    }

}

static class ColorAdapter extends XmlAdapter<String, Color> {
    public Color unmarshal(String s) {
        return Color.decode(s);
    }

    public String marshal(Color color) {
        return '#' + Integer.toHexString(color.getRGB());
    }
}
}
4

1 に答える 1

2

XmlAdapterそれが呼び出されていると思われますunmarshal が、Color.decodeメソッドが失敗していると思われます (これは、コードをデバッグしたときに発生することです)。

Color.decode("#ff0000ff");

結果は次のとおりです。

Exception in thread "main" java.lang.NumberFormatException: For input string: "ff0000ff"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Integer.parseInt(Integer.java:461)
    at java.lang.Integer.valueOf(Integer.java:528)
    at java.lang.Integer.decode(Integer.java:958)
    at java.awt.Color.decode(Color.java:707)

に a を設定しValidationEventHandlerて、Unmarshallerすべての失敗に対するフックを取得できます。デフォルトでは、JAXB impl はその問題を報告しません。

修正

正しい値を返すようにColorAdapter.marshalメソッドを修正する必要があります。

String rgb = Integer.toHexString(color.getRGB());
return "#" + rgb.substring(2, rgb.length());
于 2013-05-14T15:39:45.737 に答える