Saltar al contenido

¿Cómo configurar PropertyNamingStrategy para RestTemplate en SpringBoot?

Te damos la bienvenida a nuestra página web, ahora vas a encontrar la respuesta de lo que buscas.

Solución:

Al crear un RestTemplate necesitas configurar el objectMapper a tí. Además, debe declarar su ObjectMapper personalizado como un @Bean por lo que Spring lo construye como un singleton y lo administra por usted. Haz lo mismo para el PropertyNamingStrategyen lugar de ‘renovarlo’ y declarar la clase como static.

public class RestConfig

    /**
     * Bean to make jackson automatically convert from
     * camelCase (java) to under_scores (json) in property names
     *
     * @return ObjectMapper that maps from Java camelCase to json under_score names
     */
    @Bean
    public ObjectMapper jacksonObjectMapper()
    
        return new ObjectMapper().setPropertyNamingStrategy(propertyNamingStrategy());
    

    @Bean
    public PropertyNamingStrategy propertyNamingStrategy()
    
        return new UpperCaseUnderscoreStrategy();
    

    @Bean
    public RestTemplate restTemplate() 
       RestTemplate restTemplate = new RestTemplate();
       List> messageConverters = new ArrayList<>();
       MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
       jsonMessageConverter.setObjectMapper(jacksonObjectMapper());
       messageConverters.add(jsonMessageConverter);
       restTemplate.setMessageConverters(messageConverters); 

       return restTemplate;
    

¿Y tu clase está en un archivo separado? no necesita ser static.

    /**
     * Property naming strategy that converts both ways between camelCase and under_score
     * property names.
     */
    public static class UpperCaseUnderscoreStrategy extends PropertyNamingStrategy.PropertyNamingStrategyBase
    
        /**
         * Converts camelCase to under_score and
         * visa versa.  The idea is that this
         * name strategy can be used for both
         * marshalling and unmarshaling.
         *
         * For example, "userName" would be converted to
         * "user_name" and conversely "user_name" would
         * be converted to "userName".
         *
         * @param input formatted as camelCase or under_score string
         * @return input converted to opposite format
         */
        @Override
        public String translate(String input)
         input.length() == 0)
            
                return input; // garbage in, garbage out
            

            //
            // we always take the first character;
            // this preserves initial underscore
            //
            StringBuilder sb = new StringBuilder();

            final int length = input.length();
            int i = 0;  

            //
            // skip initial underscores
            //
            while ((i < length) && ('_' == input.charAt(i)))
            
                sb.append(input.charAt(i));
                i += 1;
            

            while (i < length)
            
                //
                // find underscores, remove and capitalize next letter
                //
                while ((i < length) && ('_' != input.charAt(i)) && !Character.isUpperCase(input.charAt(i)))
                
                    sb.append(input.charAt(i));
                    i += 1;
                

                if(i < length)
                
                    if('_' == input.charAt(i))
                    
                        // underscore to uppercase

                        //
                        // skip underscores
                        //
                        while ((i < length) && ('_' == input.charAt(i)))
                        
                            // skip underscores
                            i += 1;
                        

                        //
                        // capitalize
                        //
                        if (i < length)
                        
                            sb.append(Character.toUpperCase(input.charAt(i)));
                            i += 1;
                        
                    
                    else // uppercase to unscore + lowercase
                    
                        sb.append('_');
                        sb.append(Character.toLowerCase(input.charAt(i)));
                        i += 1;
                    
                
            
            return sb.toString();
        
    

Simplemente agregue esta anotación arriba de POJO que enviará o recibirá en su respuesta a la solicitud.

@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)

PD: la estrategia puede ser diferente según el requisito.

Si te mola la invitación, tienes la opción de dejar una reseña acerca de qué le añadirías a esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *