将 java 对象转换为 XML REST 响应
Convert java object to XML REST response
我想在 API REST 调用后 return 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;
}
}
但是当我提出休息请求时没有任何反应 - 没有任何回应。你知道我哪里错了吗?简单的内容应该 returned.
- 在@RequestMapping 中添加produces = "application/xml"。
@RequestMapping(value="/api", method=RequestMethod.GET, produces=application/xml")
- 您需要将 JAXB 注释 添加到您的 bean class (VisaResponseHeader) 以允许它被编组进入 XML。
@XmlRootElement: 这个注解用在顶层 class 表示 XML 文档中的根元素。注释中的名称属性是可选的。如果未指定,class 名称将用作文档中的根 XML 元素。
@XmlAttribute:这个注解用来表示根元素的属性。
@XmlElement: 此注释用于 class 的属性,它将成为根元素的子元素。
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.javaclass。
预期输出(使用 Postman 测试)
@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;
}
}
我想在 API REST 调用后 return 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;
}
}
但是当我提出休息请求时没有任何反应 - 没有任何回应。你知道我哪里错了吗?简单的内容应该 returned.
- 在@RequestMapping 中添加produces = "application/xml"。
@RequestMapping(value="/api", method=RequestMethod.GET, produces=application/xml")
- 您需要将 JAXB 注释 添加到您的 bean class (VisaResponseHeader) 以允许它被编组进入 XML。
@XmlRootElement: 这个注解用在顶层 class 表示 XML 文档中的根元素。注释中的名称属性是可选的。如果未指定,class 名称将用作文档中的根 XML 元素。
@XmlAttribute:这个注解用来表示根元素的属性。
@XmlElement: 此注释用于 class 的属性,它将成为根元素的子元素。
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.javaclass。
预期输出(使用 Postman 测试)
@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;
}
}