有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;
    }
}

共 (2) 个答案

  1. # 1 楼答案

    试着这样做,我认为您正在将生成自定义输出与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();
        }
    }
    

    我收到以下输出:

    {
      "status" : {
        "key" : "ELSE",
        "status" : "desc"
      }
    }
    
  2. # 2 楼答案

    我最终几乎是错误地解决了这个问题。问题在于提供JsonSerializer类的codehaus库依赖,因此Spring忽略了它。我把它从pom上删除了。xml

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

    只留下

    <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>