将java对象转换为XML REST响应
我想在API REST调用之后返回XML响应消息。我尝试了这个简单的测试:将java对象转换为XML REST响应,java,rest,jaxb,spring-rest,Java,Rest,Jaxb,Spring Rest,我想在API REST调用之后返回XML响应消息。我尝试了这个简单的测试: @RestController public class HelloWorldRestController { @Autowired ApiService apiService; @RequestMapping(value = "/api", method = RequestMethod.GET) public ResponseEntity<VisaResponse>
@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);
}
.......
}
但是当我提出休息请求时,什么也没有发生——没有任何反应。你知道我哪里错了吗?应返回简单内容
@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;
}
}
不需要VisaResponseHeader.java类
预期输出(使用邮递员测试)
@RequestMapping(value=“/api”,method=RequestMethod.GET,products=application/xml”)
@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;
}
}
不需要VisaResponseHeader.java类
预期输出(使用邮递员测试)
尝试在
@RequestMapping
中添加products=“application/xml”
。
您的注释应该是
@RequestMapping(value=“/api”,method=RequestMethod.GET,products=“application/xml”)
除此之外,还应添加@XmlRootElement(name=“visa”)
@XmlAccessorType(XmlAccessType.FIELD)
到您的VisaResponse
POJO,并@XmlElement
到XML中所需的每个元素
编辑:
import javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共类VisaResponse{
@XmlElement
私有内部visaNumber;
public int getVisaNumber(){
返回visaNumber;
}
公共无效设置visaNumber(内部visaNumber){
this.visaNumber=visaNumber;
}
}
希望这有帮助。尝试在
@RequestMapping
中添加products=“application/xml”
。
@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;
}
}
您的注释应该是
@RequestMapping(value=“/api”,method=RequestMethod.GET,products=“application/xml”)
除此之外,还应添加@XmlRootElement(name=“visa”)
@XmlAccessorType(XmlAccessType.FIELD)
到您的VisaResponse
POJO,并@XmlElement
到XML中所需的每个元素
编辑:
import javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
公共类VisaResponse{
@XmlElement
私有内部visaNumber;
public int getVisaNumber(){
返回visaNumber;
}
公共无效设置visaNumber(内部visaNumber){
this.visaNumber=visaNumber;
}
}
希望这有帮助。@RequestMapping(value=“/api”,method=RequestMethod.GET,products={
@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;
}
}
“应用程序/xml”})
公共响应列表用户(){
VisaResponse obj=apiService.VisaResponse();
返回新的响应状态(obj,HttpStatus.OK);
}
@XmlRootElement
公共类VisaResponse实现了可序列化{
私有int-id;
公众舆论{
id=3;
}
公共getId(){
返回id;
}
公共设置id(内部id){
this.id=id;
}
}
@RequestMapping(value=“/api”,method=RequestMethod.GET,products={
“应用程序/xml”})
公共响应列表用户(){
VisaResponse obj=apiService.VisaResponse();
返回新的响应状态(obj,HttpStatus.OK);
}
@XmlRootElement
公共类VisaResponse实现了可序列化{
私有int-id;
公众舆论{
id=3;
}
公共getId(){
返回id;
}
公共设置id(内部id){
this.id=id;
}
}
不幸的是,我再次得到空结果。不幸的是,我再次得到空结果。你可能是指VisaResponseHeader类?@PeterPenzov是的。你可能是指VisaResponseHeader类?@PeterPenzovyes@PeterPenzov尝试修改代码。这很好,给出了预期的XML输出,看起来我的项目设置有误。我可以要求你上传你的项目吗?我已经上传了我的样本项目。你可以克隆它。非常感谢。如果您有时间,您能告诉我如何在通信中添加身份验证和SSL加密吗?@PeterPenzov Try modified code。这很好,给出了预期的XML输出,看起来我的项目设置有误。我可以要求你上传你的项目吗?我已经上传了我的样本项目。你可以用clo
@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;
}
}