当前位置: 首页 > 知识库问答 >
问题:

JAXB -将带有名称空间的XML发送给SpringBoot中的REST控制器

昝欣可
2023-03-14

我正在将xml发布到我的springboot应用程序并将其接收到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;  
    }  
}

下面是我的控制器方法,它通过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,并使用有效的响应代码和响应消息获得所需的输出

输入post 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>

共有1个答案

解高昂
2023-03-14

XML使用命名空间前缀,但命名空间本身没有在员工的开始标记中定义。

<?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")
 类似资料:
  • 我有一个来自外部endpoint的巨大XML响应。我想解析java类的XML响应。如果没有一个XML有名称空间,我就能够解析成相应的POJOS,直到那时一切都很好。 但是,响应可能仅在根元素中包含命名空间。例如,像这样 我可以保证没有一个内部xml元素会有更多的命名空间。 有没有办法实现这一点?我看到一些完全忽略命名空间的答案,但感觉不是很有说服力。有没有办法正确解析这些。 这是我为XML响应建模

  • 我花了一些时间来调查是什么问题,但我不能解决它。当我在XML下面反封送和回封送时,我看到的是不同的XML。 在上面的xml中,只有一个标记(第一个),其余所有(包括名称空间)都是意外元素。另一个应用程序发送上述XML。 null 我真的不明白QName的事

  • 我使用JAXB从SOAP响应中解析xml元素。我已经为xml元素定义了POJO类。我已经测试了没有名称空间和前缀的pojo类,它工作得很好。需求是解析来自SOAPMessage对象的输入

  • 我正在开发一个客户端来使用 Web 服务,但由于某种原因,除非所有命名空间都正确且没有任何前缀,否则我的请求没有得到正确处理。 我所有的类都是由服务提供商使用提供的XSD和WSDL创建的。 NfeDadosMsg.class 包装信息.java TConsStatServ.class package br.inf.portalfiscal.nfe; 包装信息.java 输出xml: 由于某种原因,

  • 我需要加载XML文件,但存在两种相同的文件格式,只是名称空间不同-在我的简化示例中,: : 引用了一个特定的名称空间,因此我不能以相同的方式处理这两个文件: 给出输出: 目前,我已经以一种次优的方式进行了工作,通过使用https://stackoverflow.com/a/50800021-但如果可能的话,我想将其转移到JAXB中。 输出:

  • 我有5个schemas.xsd,用于生成Java类,然后封送XML文件。 问题是只有一种情况--对于这个文件,JAXB生成额外的名称空间前缀NS2。这是非常奇怪的,因为所有模式都是相同的,并且编组机制对于所有模式都是通用的。 生成机制: 对于不能正常工作的包: 包信息: 对象-工厂 良好工作包: 包信息: 和对象工厂看起来完全一样(当然除了命名)。