enum接口的java Spring@ResponseBody和Jackson JsonSerializer
相关问题
Spring @ResponseBody Jackson JsonSerializer with JodaTime
Usage of @JsonSerialize and JsonSerializer
问题
我有这个枚举:
@JsonSerialize(using = JSONI18NSerializer.class)
public enum Status implements EnumOption {
SOMETHING("translate.key,something"),
ELSE("translate.key.else");
private String status;
private Status(final String status) {
this.status = status;
}
@Override
public String getDescription() {
ReloadableResourceBundleMessageSource bundle =
(ReloadableResourceBundleMessageSource) ContextLoader.getCurrentWebApplicationContext()
.getBean("messageSource");
Locale locale = LocaleContextHolder.getLocale();
return bundle.getMessage(this.status, null, locale).toString();
}
}
它实现了一个简单的接口:
public interface EnumOption {
public String getDescription();
}
我写了这个定制JsonSerializer:
public class JSONI18NSerializer extends JsonSerializer<EnumOption> {
@Override
public void serialize(
EnumOption object,
JsonGenerator generator,
SerializerProvider provider)
throws IOException, JsonProcessingException {
generator.writeStartObject();
generator.writeFieldName("key");
generator.writeString(object.toString());
generator.writeFieldName("status");
generator.writeString(object.getDescription());
generator.writeEndObject();
}
}
问题
我错过了什么?通过在我的控制器上使用@ResponseBody,我得到了一个带有简单{status:"translation of something"}
的JSON,但我需要{status : {key:"something" , status : "description of something"}}
我必须在其他地方声明自定义序列化程序吗?有没有更好的方法来实现我的需求
我使用Spring 4.1.7和Jackson 2.5.1,并询问1.9.13
谢谢你的帮助
编辑 这是控制器方法:
@RequestMapping(value = "/search", method = RequestMethod.GET)
@ResponseBody
public List<Config> getAll(final ModelMap model) {
return this.configService.searchConfig();
}
状态枚举是Config类的一个属性,它是:
@Document
public class Config {
private Status status;
public Status getStatus() {
return this.status;
}
public void setStatus(final Status status) {
this.status = status;
}
}
# 1 楼答案
试着这样做,我认为您正在将生成自定义输出与
JsonSerializer
混合在一起我收到以下输出:
# 2 楼答案
我最终几乎是错误地解决了这个问题。问题在于提供JsonSerializer类的codehaus库依赖,因此Spring忽略了它。我把它从pom上删除了。xml
只留下