【问题标题】:Spring @ResponseBody and Jackson JsonSerializer for an enum interface用于枚举接口的 Spring @ResponseBody 和 Jackson JsonSerializer
【发布时间】:2015-10-01 10:47:50
【问题描述】:

相关问题

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

【问题讨论】:

    标签: java json spring spring-mvc enums


    【解决方案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"
      }
    }
    

    【讨论】:

    • 感谢您的帮助,但它似乎不起作用。我一直得到与没有序列化程序相同的输出。似乎春天忽略了它。
    • 添加控制器的方法
    • 和你的配置类 ;)
    • 我测试了您的代码并且效果很好,正如预期的那样。可能问题出在其他地方。尝试将此@JsonSerialize(using = JSONI18NSerializer.class) 放在status 类中的status 属性上
    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2017-07-09
      • 2015-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多