我希望提供一个全面的REST API,支持JSON
和XML
,并且使用MappingJacksonHttpMessageConverter
和JaxbMarshaller
分别在相同的模型上生成友好的JSON
和XML
,但是这样做往往只能得到易读的XML或易读的JSON 1)。
最佳的解决方案是什么?
1)由于像映射、根标记和关系等对象在json
和xml
中被建模方式不同,因此需要以不同的方式设计要序列化的对象才能获得整洁的json
和整洁的xml
。诸如jaxb注释之类的工具只能做到这一点。
我可以想到几个候选方案
1)创建一个json和xml控制器/模型
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
,创建一个JsonFoo
和XmlFoo
2)编写自定义消息转换器
我尝试过这样做,结果有点复杂,因为视图必须知道如何将例如Foo
解析为JsonFoo
,以便能够将其序列化为可读格式。
3)让每个模型对象自己进行序列化,例如:
public class Foo {
public String serialize(Serializer s) {
return s.serialize(this);
}
}
根据一些仲裁参数,让控制器注入正确的序列化器。
new Foo(new FooJsonSerializer());
new Foo(new FooXmlSerializer());