Search code examples
javaspringspring-bootjacksonjackson-databind

Spring boot generic String trim Serialization


I am trying to implement generic Spring trim serializer across application however its doesn't seems to be working. And if I manually put this serializer @JsonSerialize(using = StringTrimmerSerializer.class) on a particular field it does work not sure what i need to do to make it work throughout application without putting it for all fields individually

import java.io.IOException;

import org.apache.commons.lang.StringUtils;
import org.springframework.boot.jackson.JsonComponent;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

@JsonComponent
public class StringTrimmerSerializer extends JsonSerializer<String> {

  @Override
  public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {

    if (!StringUtils.isEmpty(value)) {
      value = value.trim();
    }
    gen.writeString(value);
  }

}

Update:

Tried registering serializer as well but same issue

@Configuration
public class JacksonConfiguration {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper(); //
        //mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        // mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
        mapper.registerModule(new SimpleModule().addSerializer(String.class, new StringTrimmerSerializer()));
        return mapper;
    }

    /*
     * @Bean public Module customSerializer() { SimpleModule module = new
     * SimpleModule(); module.addSerializer(String.class, new
     * StringTrimmerSerializer()); return module; }
     */
}

Main Class package : com.demo Serializer Package : com.demo.config

Spring boot Version - 2.2.5.RELEASE Jackson-databind - 2.10.2


Solution

  • I was able to resolve by registering custom serializer to jaskcosn's default object mapper rather than creating a new reference of ObjectMapper.

    @Configuration
    public class JacksonConfiguration extends WebMvcConfigurationSupport {
    
        @Autowired
        private ObjectMapper objectMapper;
    
        public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            objectMapper.registerModule(new SimpleModule().addSerializer(String.class, new StringTrimmerSerializer()));
            converter.setObjectMapper(objectMapper);
            return converter;
        }
    
        @Override
        protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.add(mappingJackson2HttpMessageConverter());
            super.configureMessageConverters(converters);
        }
    
    }