Я хочу вернуть ответное сообщение 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;
}
}
Но когда я делаю запрос на отдых, ничего не происходит - никакого ответа. Вы хоть представляете, в чем я ошибаюсь? Должен быть возвращен простой контент.




@RequestMapping(value = "/api", method=RequestMethod.GET, produces=application/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 не нужен.
Ожидаемый результат (проверено с помощью Postman)

Похоже, у меня неправильная настройка проекта. Могу я попросить вас загрузить свой проект?
Я загрузил свой образец проекта на github.com/Dharita/Java_object_to_XML_REST_Response. Вы можете его клонировать.
Большое вам спасибо. Если у вас есть время, вы можете показать мне, как я могу добавить аутентификацию и шифрование SSL при общении?
@XmlRootElement
public class VisaResponseHeader {
@XmlElement(name = "id")
private int id;
public VisaResponseHeader() {
id = 3;
}
}
К сожалению, я снова получаю пустой результат.
Попробуйте добавить produces = "application/xml" в @RequestMapping.
Ваша аннотация должна быть похожа на
@RequestMapping(value = "/api", method = RequestMethod.GET,produces = "application/xml").
Наряду с этим вы должны добавить @XmlRootElement(name = "visa")
@XmlAccessorType(XmlAccessType.FIELD) к вашему POJO VisaResponse и @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;
}
}
Надеюсь это поможет.
наверное вы имеете в виду класс VisaResponseHeader?
@PeterPenzov да
@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;
}
}
@PeterPenzov Попробуйте модифицированный код. Это работает нормально, давая ожидаемый вывод XML