繁体   English   中英

Spring Rest Service应该返回Map而不是JSON的DTO

[英]Should Spring Rest Service return Map rather than a DTO for JSON

因为为每个请求创建DTO都会很麻烦,所以我将其转换为地图。 还有其他方法可以更好地返回JSON吗?

public @ResponseBody
    Map<String, String> myTest() {    
        Map<String,String> myMap = new HashMap<String, String>();
        myMap.put("a", "1");
        myMap.put("b", "2");
        return myMap;
    }

我会说最好使用DTO并让Spring / Jackson负责所有JSon,这是一个示例

@RequestMapping(value = "/payments", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody List<Payment> batchCreate(@RequestBody List<Payment> payments) {
    return paymentService.create(payments);
}

将Jackson添加到类路径

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.0</version>
    </dependency>

希望这可以帮助。

或创建自己的序列化器

@RequestMapping(value = "/test", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
public @ResponseBody String get() throws JsonProcessingException {
    SpecialMap map = new SpecialMap();
    map.put("firstName", "Noby");
    map.put("lastName", "Stiles");

    ObjectMapper mapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    module.addSerializer(SpecialMap.class, new MapSerializer());
    mapper.registerModule(module);

    String serialized = mapper.writeValueAsString(map);
    return serialized;
}

public class MapSerializer extends JsonSerializer<SpecialMap> {
    @Override
    public void serialize(SpecialMap map, JsonGenerator jgen,
            SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jgen.writeStartObject();
        for (String key : map.keySet()) {
            jgen.writeStringField(key, map.get(key));
        }
        jgen.writeEndObject();
    }
}

public class SpecialMap extends HashMap<String,String> {

}

如果您可以直接使用实体,也可以这样做。 不过,您将需要在jackson中添加一些其他功能。

  • 中断循环引用
  • 根据响应过滤属性

对于过滤,我创建了一个小杰克逊插件,可以进行动态过滤。 可能可以帮助:

https://github.com/Antibrumm/jackson-antpathfilter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM