XmlJavaTypeAdapter XmlElement не работает для нескольких полей - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть один xml, как показано ниже, мне нужно использовать этот xml для заполнения объекта ниже. Мне нужна дата в нужном формате и преобразование даты в метку времени.Я сделал это, используя приведенный ниже код.

<customer>
    <name>john</name>
    <date>10/10/18</date>
<customer>

@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    @XmlElement(name="name")
    private String name;

    @XmlJavaTypeAdapter (DateSort.class)
    @XmlElement(name="date")
    private String date;

    @XmlJavaTypeAdapter (TimeStampSort.class)
    @XmlElement(name="date")
    private long dateTimestamp;

    setters()/getters()
}

public class DateSort extends XmlAdapter<String, String> implements DateFormats {

    @Override
    public String marshal(String date) throws Exception {
        return dateFormat.format(date);
    }

    @Override
    public String unmarshal(String date) throws ParseException {
        Date pubDate = sourceDateFormat.parse(date);
        return outputDateFormat.format(pubDate);
    }
}

public class TimeStampSort extends XmlAdapter<String, Long> implements DateFormats {

    @Override
    public Long unmarshal(String date) throws Exception {
        Date newDate = sourceDateFormat.parse(date);
        return Long.parseLong(monthFormat.format(newDate));
    }

    @Override
    public String marshal(Long date) throws Exception {
        return new Date(date).toString ();
    }
}

Проблема, с которой я здесь сталкиваюсь, заключается в том, что XmlJavaTypeAdapter вызывается для «date», но не для атрибута dateTimestamp.Я не уверен, почему существует такое поведение.

Я пытался сделать эту конфигурацию

@XmlJavaTypeAdapter (value=DateSort.class, type=Long.class)
@XmlElement(name="PUBDATE", type=Long.class)


@XmlJavaTypeAdapter (value=DateSort.class, type=long.class)
@XmlElement(name="PUBDATE", type=long.class)

и преобразовать тип в

private Long timeStamp; 

Ничего из этого не сработало.

Проблема здесь в том, что мне нужно, чтобы один и тот же элемент отображался в несколько полей pojo с преобразованиями.Существуют ли какие-либо дополнительные аннотации, которые необходимо добавить для достижения этой цели?

Пожалуйста, помогите мне решить проблему, связанную с тем, почему не вызывается TimeStampSort Adapter, когда вызывается DateSort и работает нормально.

1 Ответ

0 голосов
/ 07 февраля 2019

Ниже приведен пример того, как вы можете достичь того, о чем вы просите.

Хотя было бы лучше сделать это "дальше", то есть в сервисе при получении не маршалируемых значений.Вообще говоря, вы пытаетесь избежать слишком большой логики в простых отображаемых объектах.

@XmlRootElement
class Customer {

    private String name;

    private String date;

    private long dateTimestamp;

    public String getName() {
        return name;
    }

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

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date; // You can do additional transformations here
        try {
            this.dateTimestamp = new SimpleDateFormat("MM/dd/yy").parse(date).getTime();
        } catch (ParseException e) {
            // Handle this appropriately ;-)
        }
    }

    public long getDateTimestamp() {
        return dateTimestamp;
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", Customer.class.getSimpleName() + "[", "]")
                .add("name='" + name + "'")
                .add("date='" + date + "'")
                .add("dateTimestamp=" + dateTimestamp)
                .toString();
    }

}

public class XmlUnmarshaller {

    private static final String XML_STRING =
            "<customer>\n" +
            "    <name>john</name>\n" +
            "    <date>10/10/18</date>\n" +
            "</customer>";

    public static void main(String[] args) {

     try {
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new ByteArrayInputStream(XML_STRING.getBytes(StandardCharsets.UTF_8)));
        System.out.println(customer);

      } catch (JAXBException e) {
        e.printStackTrace();
      }
    }

}
...