Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将java对象转换为XML REST响应_Java_Rest_Jaxb_Spring Rest - Fatal编程技术网

将java对象转换为XML REST响应

将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>

我想在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);
        }
    .......
}
但是当我提出休息请求时,什么也没有发生——没有任何反应。你知道我哪里错了吗?应返回简单内容

  • 在@RequestMapping中添加products=“application/xml”<代码>@RequestMapping(value=“/api”,method=RequestMethod.GET,products=application/xml”)
  • 您需要向bean类(VisaResponseHeader)添加大量的JAXB注释,以便将其编组为XML
  • @XmlRootElement:此批注在顶级类中用于指示XML文档中的根元素。批注中的name属性是可选的。如果未指定,则将类名用作文档中的根XML元素

    @xmldattribute:此注释用于指示根元素的属性

    @xmlement:此注释用于类的属性,该类将是根元素的子元素

    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;
        }
    }
    
    不需要VisaResponseHeader.java类

    预期输出(使用邮递员测试)

  • 在@RequestMapping中添加products=“application/xml”
    @RequestMapping(value=“/api”,method=RequestMethod.GET,products=application/xml”)
  • 您需要向bean类(VisaResponseHeader)添加大量的JAXB注释,以便将其编组为XML @XmlRootElement:此注释在顶级类中用于指示XML文档中的根元素。注释中的“名称”属性是可选的。如果未指定,则将类名用作文档中的根XML元素

    @xmldattribute:此注释用于指示根元素的属性

    @xmlement:此注释用于类的属性,该类将是根元素的子元素

    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;
        }
    }
    
    不需要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;
    }
        }