JAXB, что должно быть возвращено из метода `beforeMarshal (Marshaller)`?

7 голосов | спросил Jin Kwon 9 MaramFri, 09 Mar 2012 10:38:13 +04002012-03-09T10:38:13+04:0010 2012, 10:38:13

1 ответ


0

Короткий ответ

Тип возврата boolean является ошибкой документации. Тип возвращаемого значения должен быть void.

Длинный ответ

  

Я имею в виду, во всяком случае, использовать этот метод для преобразования Long @Id JPA в   String @XmlID JAXB

Вы можете использовать EclipseLink JAXB (MOXy) в качестве он не имеет ограничения на то, чтобы поле /свойство, помеченное @XmlID, было типа String

  

с JAXB-RI и без МОКСИ.

Вы можете использовать XmlAdapter для поддержки вашего варианта использования карты:

IDAdapter

Этот XmlAdapter преобразует Long значение в String для соответствия требованиям @XmlID аннотация.

package forum9629948;

import javax.xml.bind.DatatypeConverter;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class IDAdapter extends XmlAdapter<String, Long> {

    @Override
    public Long unmarshal(String string) throws Exception {
        return DatatypeConverter.parseLong(string);
    }

    @Override
    public String marshal(Long value) throws Exception {
        return DatatypeConverter.printLong(value);
    }

}

В

Аннотация @XmlJavaTypeAdapter используется для указания XmlAdapter:

package forum9629948;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlAccessorType(XmlAccessType.FIELD)
public class B {

    @XmlAttribute
    @XmlID
    @XmlJavaTypeAdapter(IDAdapter.class)
    private Long id;

}

А

package forum9629948;

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {

    private B b;
    private C c;

}

С

package forum9629948;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)public class C {

    @XmlAttribute
    @XmlIDREF
    private B b;

}

Demo

package forum9629948;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(A.class);

        File xml = new File("src/forum9629948/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        A a = (A) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(a, System.out);
    }

}

Ввод /Вывод

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>
    <b id="123"/>
    <c b="123"/>
</a>
ответил Blaise Doughan 9 MarpmFri, 09 Mar 2012 15:12:46 +04002012-03-09T15:12:46+04:0003 2012, 15:12:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132