首页 > 解决方案 > 如何在spring RESTful中更改控制器后的值

问题描述

@RestController我想在春季课后更改数据

我需要根据指定的语言更改字段数据。

例子:

枚举:

public enum Gender {
    WOMAN, MAN, OTHER
}

控制器:

@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;
}

这个输出:

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

更改为此输出:

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

标签: springspring-mvc

解决方案


我假设 user.gender 是一个枚举。然后您可以将自定义序列化器和反序列化器添加到您的 JSON 映射器(希望是杰克逊)。

@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);
            }
        }
    }
}

此代码未经测试,只是在浏览器中编写的!(我对反序列化器/解析器代码非常不确定。)但我希望它能指导您找到解决方案。


推荐阅读