1

我从 @Controller 返回一个 Java 对象,但我想在这个特定方法上调用 Jackson 序列化程序。目前这没有给出错误,但也没有调用序列化程序。另一种方法是将@JsonSerialize 附加到返回对象的类上,但我想知道是否需要对以下代码进行一些更改以使其正常工作:

@JsonSerialize(using=SimpleShiftAllocSerializer.class, as=HashMap.class)
@RequestMapping(value = "/shifts/readAlloc.json", method = RequestMethod.GET)
public @ResponseBody
Map<String, ? extends Object> readAlloc(HttpServletRequest request,
        HttpServletResponse response) {
    // ...
    return someObjectToSerialise;
}
4

1 回答 1

1

假设您正在使用 mvc 命名空间配置,如果 jackson 在类路径上可用,则 org.springframework.http.converter.json.MappingJacksonHttpMessageConverter 会自动注册为 HttpMessageConverter。

AnnotationDrivenBeanDefinitionParser:312

if (jacksonPresent) {
    messageConverters.add(createConverterBeanDefinition(MappingJacksonHttpMessageConverter.class, source));
}

所以当一个 @ResponseBody 注解的控制器方法返回时,它会检查是否有任何注册的 HttMessageConverter 支持返回的类型和 ContentType (HttpMessageConverter.canWrite()),如果有,就会调用它的 write 方法。

它不认为 Jackson MessageConvert 支持

Map<String, ? extends Object>

要么将该映射放入 WrapperBean(带有 json 注释),要么实现您自己的 HttpMessageConverter(不要忘记注册它)

于 2012-09-17T08:53:03.360 回答