gpt4 book ai didi

java - 带有 JSON 和 XML 的 Spring REST

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:21:36 25 4
gpt4 key购买 nike

我想提供一个全面的 REST API,同时支持 JSONXML

域模型是复杂类型,我们注意到要在同一模型上使用 MappingJacksonHttpMessageConverter 生成友好的 JSONXML >JaxbMarshaller 分别倾向于提供可读的 XML 或可读的 JSON 1)

最好的方法是什么?

1) 由于 map 、根标签和关系等对象在 json 中的建模方式与在 xml 中的建模方式不同,因此需要序列化的对象以不同的方式设计以获得整洁的 json 和整洁的 xml。 jaxb 注释等实用程序只能做到这一点。


我能想到几个候选人

1) 创建一个 json 和 xml Controller /模型

public class Controller { 
public Foo foo() {
return new Foo();
}
}

public class XmlController extends Controller {
@Override
public XmlFoo foo() {
return new new XmlFoo(super.foo());
}
}

public class JsonController extends Controller {
@Override
public JsonFoo foo() {
return new JsonFoo(super.foo());
}
}

给定一个模型对象 Foo 创建一个 JsonFooXmlFoo

2) 编写自定义消息转换器

我试过了,结果有点复杂,因为 View 必须知道如何解析例如 FooJsonFoo 才能序列化它成可读的格式。

3) 让每个模型对象自己序列化,例如,

public class Foo {
public String serialize(Serializer s) {
return s.serialize(this);
}
}

基于一些仲裁参数让 Controller 注入(inject)正确的串行器

new Foo(new FooJsonSerializer());
new Foo(new FooXmlSerializer());

最佳答案

我在当前项目中执行此操作时未使用 ContentNegotiatingViewResolver。对于我的 Controller 中的一个方法:

@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
public HttpEntity<BasicResponse> getBasicResponse() {
return new HttpEntity<BasicResponse>(new BasicResponse());
}

我可以根据 Accept 请求 header 接收以下输出。

接受:application/xml(类路径上需要 JAXB2)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<basicResponse>
<errors>
<message>test1</message>
<message>test2</message>
</errors>
</basicResponse>

接受:application/json(类路径上需要 Jackson)

{
"errors" : ["test1", "test2"]
}

我的响应对象很简单并且使用普通注释:

package org.mypackage.response;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

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

@XmlElementWrapper(name = "errors")
@XmlElement(name = "message")
private List<String> errors = new ArrayList<String>();

public BasicResponse() {
this.errors.add("test1");
this.errors.add("test2");
}

public List<String> getErrors() {
return errors;
}

}

SpringSource spring-mvc-showcase project也是一个有用的资源。我认为他们将不同方法的转换分开,但我肯定是为一种方法这样做。

我不太清楚你的问题...但是如果你希望序列化输出不止于此,@chrylis 是正确的,因为自定义序列化程序将是你的下一步。但是我遇到的所有事情(可能会变得非常复杂,在我的响应中包含嵌套对象)都可以完美地转换为有效的 XML 或 JSON。

关于java - 带有 JSON 和 XML 的 Spring REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18335002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com