0

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;
    }
}
Community
  • 1
  • 1
peter_f
  • 258
  • 1
  • 2
  • 11

2 Answers2

1

Try with this, I think you are mixing generation of custom output with the JsonSerializer

public class JSONI18NSerializer extends JsonSerializer<EnumOption> {
    @Override
    public void serialize(
            EnumOption object,
            JsonGenerator generator,
            SerializerProvider provider)
            throws IOException, JsonProcessingException {
        generator.writeStartObject();
        generator.writeFieldName("status");
        generator.writeStartObject();
        generator.writeFieldName("key");
        generator.writeString(object.toString());
        generator.writeFieldName("status");
        generator.writeString(object.getDescription());
        generator.writeEndObject();
        generator.writeEndObject();
    }
}

I'm receiving following output:

{
  "status" : {
    "key" : "ELSE",
    "status" : "desc"
  }
}
Nikolay Rusev
  • 4,060
  • 3
  • 19
  • 29
0

I finally solved it almost by mistake. The problem was a codehaus library dependency that provided the JsonSerializer class and so Spring was ignoring it. I deleted it from the pom.xml

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

And kept only

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

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

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.5.1</version>
    </dependency>
peter_f
  • 258
  • 1
  • 2
  • 11