Spring Boot Deserialization Snake Case to Camel Case Fails. Can't Deserialize "Some_Value" to "Somevalue"

Jersey JSON switching from camel case to underscores (snake case)

This is something that needs to be configured with the Jackson ObjectMapper. You can do this in a ContextResolver. Basically, you need something like

@Provider
public class MapperProvider implements ContextResolver<ObjectMapper> {
final ObjectMapper mapper;

public MapperProvider() {
mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(
PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
}

@Override
public ObjectMapper getContext(Class<?> cls) {
return mapper;
}
}

Then register with your client

client.register(MapperProvider.class);

If you need this support on the server also, then you will need to register it on the server too.

Multiple ObjectMappers for different parts of API

If both parts of the API are not dealing with the same domain objects, you'll be able to do it by providing your own implementation of MappingJackson2HttpMessageConverter that overwrite the canRead and canWrite methods. Here an example using the base package of the object which must be serialized :

Custom converter :

public class CustomConverter extends MappingJackson2HttpMessageConverter {

private String basePackage;

public CustomConverter(String basePackage) {
this.basePackage = basePackage;
}

@Override
public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
if (contextClass.getName().startsWith(basePackage)) {
return super.canRead(type, contextClass, mediaType);
}
return false;
}

@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
if (clazz.getName().startsWith(basePackage)) {
return super.canWrite(clazz, mediaType);
}
return false;
}
}

Configuration

@Configuration
public class Configuration {

@Bean
public MappingJackson2HttpMessageConverter camelCaseConverter() {
MappingJackson2HttpMessageConverter converter = new CustomConverter("package.camel");
converter.setObjectMapper(camelCaseObjectMapper());
return converter;
}

@Bean
public MappingJackson2HttpMessageConverter snakeCaseConverter() {
MappingJackson2HttpMessageConverter converter = new CustomConverter("package.snake");
converter.setObjectMapper(snakeCaseObjectMapper());
return converter;
}

@Bean
public ObjectMapper camelCaseObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE);

return mapper;
}

@Bean
public ObjectMapper snakeCaseObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true);
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

return mapper;
}
}

Unable to unmarshal array of elements with inner text

You can use @XmlValue for the property mapping to the inner text.

@XmlAccessorType(XmlAccessType.FIELD)
public class Item {

@XmlAttribute
private String atr;

@XmlValue
private String value;

}

For More Information

  • http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html


Related Topics



Leave a reply



Submit