带有JSON和XML的Spring REST

Joh*_*erg 9 java rest spring json spring-mvc

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

域模型是复杂的类型的,并且我们注意到,以产生友好JSONXML上使用相同的模型MappingJacksonHttpMessageConverterJaxbMarshaller分别往往给任一可读XML或JSON可读1) .

什么是最好的方法?

1)由于地图,根标签和关系等对象的建模方式与in 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()); 
   } 
}
Run Code Online (Sandbox Code Playgroud)

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

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

我试过这个并且结果有点复杂,因为视图必须知道如何解决,例如,a FooJsonFoo能够将其序列化为可读格式.

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

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)

tre*_*bor 5

我在当前项目中这样做而没有使用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.