【问题标题】:Format xml output in spring boot在spring boot中格式化xml输出
【发布时间】:2017-11-07 05:09:41
【问题描述】:

我有一个简单的端点如下:

@RequestMapping("/foo")
public Foo[] getFoo() {
    List<Foo> list = new ArrayList<>();
    list.add(new Foo("bar"));
    list.add(new Foo("baz"));
    list.add(new Foo("bat"));
    return list.toArray(new Foo[list.size()]);
}

当我使用 curl 向此端点发送请求时,如下所示:

curl -i -H "Accept: application/xml" localhost:8080/foo

输出是这样的:

<Foos>
 <item>
   <name>bar</name>
 </item>
 <item>
   <name>baz</name>
 </item>
 <item>
   <name>bat</name>
</item>
</Foos>

有没有办法指示 Spring Boot 将项目更改为 Foo 类的名称?

这是 Foo 类:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

private String name;

public Foo() {
}

public Foo(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

同一端点和类的球衣输出所需的格式(Foo 而不是 item)。如何在不更改 Foo 类的情况下在 spring mvn 中实现这一点?

这是所需的 xml 输出:

<Foos>
<Foo>
  <name>bar</name>
</Foo>
<Foo>
  <name>baz</name>
</Foo>
<Foo>
  <name>bat</name>
</Foo>

所以基本上我希望能够在不修改 Foo 类的情况下控制元素的名称。

【问题讨论】:

  • 您能否在xml 中添加所需的输出,这样更容易理解您的目标是什么。谢谢。
  • @lazarov 查看更新后的问题。

标签: xml spring-boot jaxb jersey


【解决方案1】:

不妨试试:

 @XmlRootElement(name="Foos")
    public class GetFooResponse{


        private List<Foo> someList;


        @XmlElement(name="Foo")
        public List<Foo> getSomeList() {
            return someList;
        }

        public void setSomeList(List<Foo> someList) {
            this.someList = someList;
        } 

        public GetResponse(List<Foo> someListValue) {
            this();
            this.someList = someListValue;  
        }

        /**
         * 
         */
        public GetResponse() {
            // TODO Auto-generated constructor stub
        }
    } 

这可能会生成您想要的输出。您必须将方法的返回类型从 Foo[] -> GetFooResponse 替换。

【讨论】:

  • 谢谢,但不幸的是我不能使用包装解决方案。因为这会影响不可取的 json 输出。
  • 你能不能至少给 Foo.class 添加额外的注释,或者它是从一些 *.wsdl 文件自动生成的,你不能以任何方式修改它?
  • 我无法更改 Foo 类的原因是它被 Jax rs 中实现的其他服务使用。我在 Spring Boot 中实现了类似的服务,因此希望在不更改域对象的情况下获得准确的输出。
  • 让我看看我是否明白这一点:你不能使用包装器并且你不能在任何地方修改 Foo.class大大地。所以解决方案应该是丑陋的。你考虑过使用Nodes 吗?
  • 确实如此。什么是节点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2017-11-30
  • 1970-01-01
  • 2016-01-23
相关资源
最近更新 更多