【问题标题】:Null values as empty strings when using @ResponseBody annotation使用 @ResponseBody 注释时空值作为空字符串
【发布时间】:2012-10-17 12:11:34
【问题描述】:

在使用@ResponseBody 注解时有没有办法将空值映射到空字符串?

【问题讨论】:

    标签: spring spring-mvc jackson


    【解决方案1】:

    您将不得不编写一个自定义 Jackson 序列化器 - 一个很好的示例在这里 - http://wiki.fasterxml.com/JacksonHowToCustomSerializers(有一个具体示例说明如何将空值转换为您可以使用的空字符串)

    这里是所有步骤(杰克逊

    编写您的自定义 null 序列化器:

    import java.io.IOException;
    
    import org.codehaus.jackson.JsonGenerator;
    import org.codehaus.jackson.JsonProcessingException;
    import org.codehaus.jackson.map.JsonSerializer;
    import org.codehaus.jackson.map.SerializerProvider;
    
    public class NullSerializer extends JsonSerializer<Object> {
    
        @Override
        public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
            jgen.writeString("");
        }
    }
    

    向 Jackson Objectmapper 注册:

    import org.codehaus.jackson.map.ObjectMapper;
    import org.codehaus.jackson.map.ser.StdSerializerProvider;
    
    
    public class CustomObjectMapper extends ObjectMapper{
        public CustomObjectMapper(){
            StdSerializerProvider sp = new StdSerializerProvider();
            sp.setNullValueSerializer(new NullSerializer());
            this.setSerializerProvider(sp);
        }
    
    }
    

    用 Spring MVC 注册这个 objectmapper:

    <mvc:annotation-driven> 
       <mvc:message-converters register-defaults="true">
           <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
               <property name="objectMapper">
                   <bean class="CustomObjectMapper"/>
               </property>
           </bean>
       </mvc:message-converters>
    </mvc:annotation-driven>
    

    【讨论】:

    • 好的,但我必须在应用程序上下文中设置它?到目前为止,除了在类路径中包含 Jackson jar 之外,我什么也没做。
    • 我在spring config xml中得到这个错误:元素'mvc:annotation-driven' must have no character or element information item [children],因为类型的内容类型是空的。
    • 解决了该错误-使用的是旧版本的spring xml shcema-但是解决方案不起作用。 NullSerializer 上的断点从未命中,尽管 CustomerObjectMapper 上的断点被命中。日期仍然显示为: "someDate":null 而不是所需的 "someDate":""
    【解决方案2】:

    我在我的项目中也遇到了同样的问题,因此我很快想出了一个解决方案。这篇文章肯定会帮助所有在同一问题上苦苦挣扎的人。

    第 1 步:- 创建您的自定义 Null 处理程序序列化程序。

    public class NullSerializer extends StdSerializer<Object> {
    
        public NullSerializer(Class<Object> t) {
           super(t);
        }
    
        public NullSerializer() {
          this(null);
        }
    
        @Override
        public void serialize(Object o, com.fasterxml.jackson.core.JsonGenerator jsonGenerator, com.fasterxml.jackson.databind.SerializerProvider serializerProvider) throws IOException {
           jsonGenerator.writeString("");
        }
       }
    

    第 2 步:- 创建 MappingJackson2HttpMessageConverter 的 bean。

    @Bean
    @Primary
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
        mapper.getSerializerProvider().setNullValueSerializer(new NullSerializer());
        jsonConverter.setObjectMapper(mapper);
        return jsonConverter;
    
    } 
    

    感谢您抽出时间阅读这篇文章。我希望这能够在一定程度上解决您的疑问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-13
      • 2015-07-17
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多