Преобразовать Java-объект в XML-ответ REST - PullRequest
0 голосов
/ 30 мая 2018

Я хочу вернуть ответное сообщение XML после вызова API REST.Я попробовал этот простой тест:

@RestController
public class HelloWorldRestController {

    @Autowired
    ApiService apiService;
    @RequestMapping(value = "/api", method = RequestMethod.GET)
        public ResponseEntity<VisaResponse> listAllUsers() {
            VisaResponse obj = apiService.visaresponse();
            return new ResponseEntity<VisaResponse>(obj, HttpStatus.OK);
        }
    .......
}

Я пытался преобразовать простой объект в XML

public class VisaResponse {

    public VisaResponse() {
        jaxbObjectToXML(new VisaResponseHeader());
    }

    private static String jaxbObjectToXML(VisaResponseHeader customer) {
        String xmlString = "";
        try {
            JAXBContext context = JAXBContext.newInstance(VisaResponseHeader.class);
            Marshaller m = context.createMarshaller();

            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // To format XML

            StringWriter sw = new StringWriter();
            m.marshal(customer, sw);
            xmlString = sw.toString();

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

public class VisaResponseHeader {

    private int id;

    public VisaResponseHeader() {
        id = 3;
    }   
}

Но когда я делаю запрос на отдых, ничего не происходит - никакого ответа.Ты хоть представляешь, где я не прав?Простой контент должен быть возвращен.

Ответы [ 4 ]

0 голосов
/ 30 мая 2018
 @RequestMapping(value = "/api", method = RequestMethod.GET, produces = {
        "application/xml" })
    public ResponseEntity<VisaResponse> listAllUsers() {
        VisaResponse obj = apiService.visaresponse();
        return new ResponseEntity<VisaResponse>(obj, HttpStatus.OK);
    }



    @XmlRootElement
    public class VisaResponse implements Serializable{

        private int id;

        public VisaResponse() {
            id = 3;
        } 
public getId(){
return id;
}  
public setId(int id) {
this.id = id;
}
    }
0 голосов
/ 30 мая 2018
@XmlRootElement
public class VisaResponseHeader {

    @XmlElement(name = "id")
    private int id;

    public VisaResponseHeader() {
        id = 3;
    }   
}
0 голосов
/ 30 мая 2018

Попробуйте добавить produces = "application/xml" внутри @RequestMapping.Ваша аннотация должна выглядеть как @RequestMapping(value = "/api", method = RequestMethod.GET,produces = "application/xml").

. Наряду с этим вы должны добавить @XmlRootElement(name = "visa") @XmlAccessorType(XmlAccessType.FIELD) к вашему VisaResponse POJO и @XmlElement к каждому элементу, который вы хотите в XML.

Отредактировано:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

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

    @XmlElement
    private int visaNumber;

    public int getVisaNumber() {
        return visaNumber;
    }

    public void setVisaNumber(int visaNumber) {
        this.visaNumber = visaNumber;
    }

}

Надеюсь, это поможет.

0 голосов
/ 30 мая 2018
  1. Добавить производит = "application / xml" внутри @RequestMapping.@RequestMapping(value="/api", method=RequestMethod.GET, produces=application/xml")
  2. Вам необходимо добавить количество JAXB-аннотаций в ваш класс бинов (VisaResponseHeader), чтобы позволить его маршалировать в XML.

@ XmlRootElement: Эта аннотация используется в классе верхнего уровня для обозначения корневого элемента в документе XML.Атрибут имени в аннотации не является обязательным.Если не указано, имя класса используется в качестве корневого XML-элемента в документе.

@ XmlAttribute: Эта аннотация используется для указания атрибута корневого элемента.

@ XmlElement: Эта аннотация используется для свойств класса, которые будут подэлементами корневого элемента.

HelloWorldRestController .java

@RestController
public class HelloWorldRestController {

    @Autowired
    ApiService apiService;

    @RequestMapping(value = "/api", method = RequestMethod.GET)
    public ResponseEntity<String> listAllUsers() {
        // get data from database
        VisaResponse visaResponse = apiService.visaresponse();

        // convert bean to XML
        String xmlResponse = jaxbObjectToXML(visaResponse);

        return new ResponseEntity<>(xmlResponse, HttpStatus.OK);
    }

    private static String jaxbObjectToXML(VisaResponse customer) {
        String xmlString = "";
        try {
            JAXBContext context = JAXBContext.newInstance(VisaResponse.class);
            Marshaller m = context.createMarshaller();

            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            StringWriter sw = new StringWriter();
            m.marshal(customer, sw);
            xmlString = sw.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return xmlString;
    }
}

VisaResponse.java

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

        @XmlElement
        private int id;

        // for testing purpose. Remove once database integration is done and data is received via service and repository.
        public VisaResponse() {
            id = 3;
        }
    }

Нет необходимости в классе VisaResponseHeader.java.

Ожидаемый результат (проверено почтальоном) enter image description here

...