mehnet ali
mehnet ali

Reputation: 133

how to change value after controller in spring RESTful

I want change data after @RestController class in Spring

I need to change the fields data based on the specified language.

example:

enum:

public enum Gender {
    WOMAN, MAN, OTHER
}

the controller:

@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
public User get(@PathVariable Long id) throws Exception {

    log.debug("Entering get( id={} )", id);

    User user = null;

    try {
        user = UserService.get(id);

    } catch (Exception e) {
        log.debug("Error occurred in get().", e);

        throw e;
    }

    return user;
}

this output:

{
    fisrtName: 'john',
    lastName: 'doe',
    gender: 'man'
}

change to this output:

{
    fisrtName: 'john',
    lastName: 'doe',
    gender: 'homme'
}

Upvotes: 0

Views: 287

Answers (2)

mehnet ali
mehnet ali

Reputation: 133

I changed code:

the controller:

@Autowired
GlobalMassengerAdvice globalMassenger;

@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
public User get(@PathVariable Long id) throws Exception {

    log.debug("Entering get( id={} )", id);

    User user = null;

    try {
        user = userService.get(id);
        
        String value = globalMassenger.getMessage(user.getGender().name());
        
        user.setGender( value );

    } catch (Exception e) {
        log.debug("Error occurred in get().", e);

        throw e;
    }

    return user;
}

I add new Class (GlobalMassengerAdvice):

@ControllerAdvice
public class GlobalMassengerAdvice {

    @Autowired
    private MessageSource messageSource;
    
    public String getMessage(final String messageKey, final Object... messageParameters) {
        Locale locale = LocaleContextHolder.getLocale();
        String result = null;
        try {
            result = messageSource.getMessage(messageKey, messageParameters, locale);
        } catch (NoSuchMessageException e) {
            result = messageKey;
        }
        return result;
    }
    
}

Upvotes: 0

Ralph
Ralph

Reputation: 120871

I assume user.gender is a enum. Then you could add a custom Serializer and Deserializer to your JSON Mapper (hopefully Jackson).

@JsonComponent
public class TranslatedGenderJsonComponent {

   public static class TranslatedGenderSerializer extends StdSerializer<Gender> {
        
        public TranslatedGenderSerializer () {
            super(Gender.class);
        }
    
        public void serialize(
          Gender gender, JsonGenerator generator, SerializerProvider provider) 
          throws IOException, JsonProcessingException {
    
            String translatedGender = myTranslateFunction(gender);
    
            generator.writeString(translatedGender );
        }
    }   

    public static class TranslatedGenderDeserializer extends StdDeserializer<Gender> {
        
        public TranslatedGenderDeserializer () {
            super(Gender.class);
        }
    
       public Gender deserialize(JsonParser jp, DeserializationContext ctxt) 
          throws IOException, JsonProcessingException {

            JsonToken currentToken = jp.getCurrentToken();      
            if (currentToken.equals(JsonToken.VALUE_STRING)) {             
                String text jp.getText().trim();
                Gender gender = myInverseTranslateFunction(text);
                return gender;
            } else if (currentToken.equals(JsonToken.VALUE_NULL)) {
                return getNullValue();
            } else {        
                throw ctxt.mappingException(Gender.class);
            }
        }
    }
}

This code is not tested, it is just written in the browser! (I am quite unsure with the deserializer/parser code.) But I hope it will guide you to a solution.

Upvotes: 1

Related Questions