Related questions
Spring @ResponseBody Jackson JsonSerializer with JodaTime
Usage of @JsonSerialize and JsonSerializer
Problem
I have this enum:
@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();
}
}
That implements a simple interface:
public interface EnumOption {
public String getDescription();
}
And I wrote this custom 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();
}
}
Question
What am I missing? By using @ResponseBody on my controller, I'm getting a JSON with a simple {status:"translation of something"}
but I need {status : {key:"something" , status : "description of something"}}
.
Do I have to declare the custom serializer somewhere else? Is there maybe a better way to achieve what I need?
I'm using Spring 4.1.7 and Jackson 2.5.1 and ask 1.9.13
Thank you for your help!!
Edit This is the controller method:
@RequestMapping(value = "/search", method = RequestMethod.GET)
@ResponseBody
public List<Config> getAll(final ModelMap model) {
return this.configService.searchConfig();
}
The status enum is an attribute of the Config class which is:
@Document
public class Config {
private Status status;
public Status getStatus() {
return this.status;
}
public void setStatus(final Status status) {
this.status = status;
}
}