[英]Convert java object to XML REST response
我想在API REST调用后返回XML响应消息。 我尝试了这个简单的测试:
@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文档中的根元素。 批注中的name属性是可选的。 如果未指定,则将类名用作文档中的根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类。
@XmlRootElement
public class VisaResponseHeader {
@XmlElement(name = "id")
private int id;
public VisaResponseHeader() {
id = 3;
}
}
尝试在@RequestMapping
内添加produces = "application/xml"
。 您的注释应类似于@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;
}
}
希望这可以帮助。
@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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.