example ejemplo deserializer deserialize java json spring-mvc naming-conventions jackson

java - ejemplo - modelmapper spring



¿Cómo puedo habilitar la carcasa Pascal de manera predeterminada cuando uso Jackson JSON en Spring MVC? (3)

Tengo un proyecto que usa Spring MVC para crear y manejar múltiples puntos finales REST. Actualmente estoy trabajando en el uso de Jackson para manejar automáticamente la separación / deserialización de JSON utilizando las anotaciones @RequestBody y @ResponseBody .

He conseguido que Jackson trabaje, así que tengo un punto de partida. Mi problema es que nuestra antigua serialización se hizo manualmente y usamos la carcasa Pascal en lugar de la carcasa Camel ("MyVariable" en lugar de "myVariable"), y Jackson hace la carcasa Camel por defecto.

Sé que puedo cambiar manualmente el nombre de una variable usando @JsonProperty . Dicho esto, no considero que agregar @JsonProperty a todas mis variables sea una solución viable a largo plazo.

¿Hay alguna manera de hacer que Jackson use la carcasa de Pascal al serializar y deserializar, además de utilizar la anotación @JsonProperty ?

EDITAR: Parece que no hay una manera limpia de hacer esto externamente. Un par de personas sugirieron reemplazar las diferentes clases como una forma de lograr mi objetivo. Estoy abierto a sugerencias sobre lo que puedo anular que cambiará la carcasa. Por el momento, he creado un ObjectMapper personalizado que establece algunas propiedades que quiero (a saber, Inclusion.NON_NULL ). Todavía no he encontrado ningún lugar que me permita cambiar el comportamiento de la carcasa. ¿Alguna idea?


Por lo que vale, hay un problema de Jira para apoyar estrategias conectables; votar por él podría ayudar a convencer a los desarrolladores para que agreguen apoyo. Como mencioné en el comentario, es posible anular el comportamiento interno, pero no es algo simple de hacer.


Terminé resolviendo el problema anulando los (de) serializadores. Para los interesados, he aquí cómo puedes hacerlo tú mismo:

Paso 1. Extienda BeanSerializerFactory .

Reemplace el _constructWriter(SerializationConfig config, TypeBindings typeContext, PropertyBuilder pb, boolean staticTyping, String name, AnnotatedMember propertyMember) . Dentro de ese método, modifique el name de la manera que mejor le parezca. Para implementar la carcasa de Pascal, utilicé esta línea: String formattedName = name.substring(0, 1).toUpperCase() + name.substring(1); . Después de modificar el name , llame a super._constructWriter .

Paso 2. Extienda BeanDeserializationFactory .

Reemplace el constructSettableProperty(DeserializationConfig config, BasicBeanDescription beanDesc, String name, AnnotatedMethod setter) . Haga lo mismo con el parámetro de name que hizo dentro de su BeanSerializerFactory personalizado.

Paso 3. Crea un ObjectMapper .

Configure la fábrica de serializadores para que sea su fábrica de serializadores de beans personalizados. Establezca el proveedor del deserializador (utilicé esta línea: objectMapper.setDeserializerProvider(new StdDeserializerProvider(new CustomJacksonBeanDeserializerFactory())) ).

Eso es. ObjectMapper que ha creado utilizará su nuevo esquema de nombres al serializar o deserializar JSON.