Поле LocalDate становится пустым в ответе xml - PullRequest
0 голосов
/ 19 сентября 2018

Я создаю простое приложение с весенней загрузкой с помощью Jersey REST для возврата списка объектов сообщения, в котором есть идентификатор, сообщение, созданный (LocalDate) и автор.

Созданное поле типа Java 8 LocalDate становится пустымв ответе xml.Он возвращается, когда я возвращаю JSON-ответ.DemoBean -

@XmlRootElement
public class DemoBean {

    private long id;
    private String message;
    private LocalDate created;
    private String author;

    public DemoBean(){

    }

    public DemoBean(long id, String message, LocalDate created, String author) {
        this.id = id;
        this.message = message;
        this.created = created;
        this.author = author;
    }

Конечная точка -

@GET
    @Path("/messages")
    @Produces(MediaType.APPLICATION_XML)
    public List<DemoBean> getDemo(@QueryParam("message") String message){
        log.info("getDemo() - START");

        return demoService.getAllDemoBeans();
    }

Ответ XML -

> <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <demoBeans>
>     <demoBean>
>         <author>xyz</author>
>         <created/>
>         <id>1</id>
>         <message>Hey there!</message>
>     </demoBean>

Почему созданное поле становится пустым?Что нужно сделать здесь?пожалуйста, помогите.

1 Ответ

0 голосов
/ 20 сентября 2018

Основная причина здесь в том, что для LocalDate не определено XmlAdapter, определенное из коробки;поэтому вы должны ввести свой собственный.

Например, вы можете:

  1. Определить свой адаптер для LocalDate:

    package us.atamai.service;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    import java.time.LocalDate;
    
    public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {
    
        public LocalDate unmarshal(String v) throws Exception {
            return LocalDate.parse(v);
        }
    
        public String marshal(LocalDate v) throws Exception {
            return v.toString();
        }
    
    }
    
  2. И пометьте получатель с помощью @XmlJavaTypeAdapter:

    @XmlJavaTypeAdapter(value = LocalDateAdapter.class)
    public LocalDate getCreated() {
        return created;
    }
    

После этого у вас будет следующий вывод:

<demoBeans>
    <demoBean>
        <author>author1</author>
        <created>2018-09-19</created>
        <id>1</id>
        <message>message1</message>
    </demoBean>
    <demoBean>
        <author>author2</author>
        <created>2018-09-20</created>
        <id>2</id>
        <message>message2</message>
    </demoBean>
</demoBeans>
...