【问题标题】:JAXB - Send XML with namespace to REST controller in SpringBootJAXB - 在 SpringBoot 中将带有命名空间的 XML 发送到 REST 控制器
【发布时间】:2018-03-12 00:27:18
【问题描述】:

我正在向我的 springboot 应用程序发布一个 xml 并将其接收到 Pojo Jaxb 并返回一个响应。我能够成功地做到这一点,但是如果我使用命名空间传递 xml,我得到的响应代码为 406,响应正文为无内容。我尝试了各种方法在我的 Pojo 中添加命名空间,甚至尝试在 package-info 中添加它,但我无法找到让它工作的方法,请指教。下面是一个没有命名空间的简单 xml 的工作示例

Pojo Employee.java

@XmlRootElement(name = "Employee")
public class Employee {  
    private int id;  
    private String name;  
    private float salary;  

    public Employee() {}  
    public Employee(int id, String name, float salary) {  
        super();  
        this.id = id;  
        this.name = name;  
        this.salary = salary;  
    }  
    @XmlAttribute  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    @XmlElement  //(namespace="http://www.example.org/property")
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    @XmlElement  
    public float getSalary() {  
        return salary;  
    }  
    public void setSalary(float salary) {  
         this.salary = salary;  
    }  
}

下面是我的 Controller 方法,它通过 POJO 从 xml 中获取值

@RequestMapping(value = { "/myURL" }, method = RequestMethod.POST, consumes = { "application/xml" })
public ResponseEntity<?> postMethodXMLreturnXML(@RequestBody Employee list) {  
    try {
        Employee FirstValue=list;
        System.out.println("SOP : post Method started . Name " + FirstValue.getName());         
        return new ResponseEntity<Object>(Employee , HttpStatus.CREATED);
    } catch (Exception e) {
        e.printStackTrace();
        return (new ResponseEntity<String>(ErrorCodes.SERVER_ERROR.getDescription(),
                HttpStatus.INTERNAL_SERVER_ERROR));
    }
}

以下是我发布到此的 xml,并通过有效的响应代码和响应消息获得所需的输出

输入帖子xml

<?xml version="1.0"?>
<Employee>
  <id>1</id>
  <name>myName</name>
  <salary>1.1</salary>
</Employee>

但是我现在想在 xml 下面传递,当我在 xml 下面传递给这段代码时,我得到响应代码 406 并且没有内容,尝试在 pojo 中添加命名空间,甚至尝试将代码添加到包信息中,请指教 在此先感谢

<?xml version="1.0"?>
<Employee>
  <myns:id>1</myns:id>
  <myns:name>myName</myns:name>
  <myns:salary>1.1</myns:salary>
</Employee>

【问题讨论】:

  • 您只在开始标签中使用命名空间。结束标签没有。
  • 收盘也有,更新了...
  • 附上客户端代码。
  • 使用swagger进行测试

标签: java xml spring-boot namespaces jaxb


【解决方案1】:

XML 使用命名空间前缀,但命名空间本身并未在 Employee 的开始标记中定义。

<?xml version="1.0"?>
<Employee xmlns:myns="http://example/a/b/c">
  <myns:id>1</myns:id>
  <myns:name>myName</myns:name>
  <myns:salary>1.1</myns:salary>
</Employee>

还将命名空间添加到每个 XML 元素。

@XmlElement(namespace="http://example/a/b/c")

【讨论】:

  • @paarthbatra 你如何发送它?你在标题中使用Content-Type: application/xml 吗?
  • 我正在发布您刚刚在我的 spring boot microservice 的 post URL 的答案中发布的 xml。并作为响应接收响应代码 406 和响应正文没有内容和响应标头 {“connection”:“close”,“cache-control”:“must-revalidate,no-cache,no-store”,“server”:“未指定", "内容类型": null } 。基本上它无法读取输入 xml
  • 是的 .. 见受控代码。消耗 = {“应用程序/xml”}
  • @paarthbatra 这是一个Accept 标头,服务器告诉客户端它接受什么类型的内容。我指的是客户端 Content-Type 标头告诉服务器您在正文中发送的内容类型。
  • 是的,在客户端也设置
猜你喜欢
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
相关资源
最近更新 更多