Example JSON (note that the string has trailing spaces):
{ "aNumber": 0, "aString": "string " }
Ideally, the deserialised instance would have an aString property with a value of "string" (i.e. without trailing spaces). This seems like something that is probably supported but I can't find it (e.g. in DeserializationConfig.Feature).
We're using Spring MVC 3.x so a Spring-based solution would also be fine.
I tried configuring Spring's WebDataBinder based on a suggestion in a forum post but it does not seem to work when using a Jackson message converter:
@InitBinder public void initBinder( WebDataBinder binder ) { binder.registerCustomEditor( String.class, new StringTrimmerEditor( " \t\r\n\f", true ) ); }
To remove leading and trailing spaces in Java, use the trim() method. This method returns a copy of this string with leading and trailing white space removed, or this string if it has no leading or trailing white space.
You can use the STRIP function to remove both the leading and trailing spaces from the character strings.
Use the Trim() method to remove leading and trailing whitespace from a string.
A leading space is a space that is located before the first character (letter, number, punctuation mark) in a text entry field. A trailing space is a space that is located after the final character in a text entry field.
Easy solution for Spring Boot users, just add that walv's SimpleModule extension to your application context:
package com.example; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; import org.springframework.stereotype.Component; import java.io.IOException; @Component public class StringTrimModule extends SimpleModule { public StringTrimModule() { addDeserializer(String.class, new StdScalarDeserializer<String>(String.class) { @Override public String deserialize(JsonParser jsonParser, DeserializationContext ctx) throws IOException, JsonProcessingException { return jsonParser.getValueAsString().trim(); } }); } }
Another way to customize Jackson is to add beans of type com.fasterxml.jackson.databind.Module to your context. They will be registered with every bean of type ObjectMapper, providing a global mechanism for contributing custom modules when you add new features to your application.
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
if you are not using spring boot, you have to register the StringTrimModule yourself (you do not need to annotate it with @Component)
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="modulesToInstall" value="com.example.StringTrimModule"/> </bean
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With