Joh*_*erg 9 java rest spring json spring-mvc
我想提供一个全面的REST API,支持JSON
和XML
.
域模型是复杂的类型的,并且我们注意到,以产生友好JSON
和XML
上使用相同的模型MappingJacksonHttpMessageConverter
和JaxbMarshaller
分别往往给任一可读XML或JSON可读1) .
什么是最好的方法?
1)由于地图,根标签和关系等对象的建模方式与in json
中的不同xml
,因此需要对要序列化的对象进行不同的设计以使其既干净json
又整洁xml
.诸如jaxb注释之类的实用程序只能走得那么远.
我能想到几个候选人
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());
}
}
Run Code Online (Sandbox Code Playgroud)
给定一个模型对象Foo
创建一个JsonFoo
和XmlFoo
我试过这个并且结果有点复杂,因为视图必须知道如何解决,例如,a Foo
到JsonFoo
能够将其序列化为可读格式.
public class Foo {
public String serialize(Serializer s) {
return s.serialize(this);
}
}
Run Code Online (Sandbox Code Playgroud)
基于一些仲裁参数,让控制器注入正确的串行器
new Foo(new FooJsonSerializer());
new Foo(new FooXmlSerializer());
Run Code Online (Sandbox Code Playgroud)
我在当前项目中这样做而没有使用ContentNegotiatingViewResolver
.对于我的控制器中的一种方法:
@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
public HttpEntity<BasicResponse> getBasicResponse() {
return new HttpEntity<BasicResponse>(new BasicResponse());
}
Run Code Online (Sandbox Code Playgroud)
我可以根据Accept
请求标头收到以下输出.
接受:application/xml(在类路径上需要JAXB2)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<basicResponse>
<errors>
<message>test1</message>
<message>test2</message>
</errors>
</basicResponse>
Run Code Online (Sandbox Code Playgroud)
接受:application/json(需要杰克逊在类路径上)
{
"errors" : ["test1", "test2"]
}
Run Code Online (Sandbox Code Playgroud)
我的响应对象很简单,并使用普通注释:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在SpringSource的弹簧MVC-展示项目也是一个有用的资源.我认为他们将转换分为不同的方法,但我肯定是为一种方法做这个.
我无法用你的问题来判断......但如果你想要输出更多的输出,@ chrylis是正确的,因为自定义序列化器将是你的下一步行动.但是我遇到的所有事情(在我的响应中可能变得非常复杂,嵌套对象)完全转换为有效的XML或JSON.
归档时间: |
|
查看次数: |
26045 次 |
最近记录: |