如何在到达带注释的句柄之前转换Requestbody的字段

时间:2019-05-01 01:47:47

标签: java spring-boot

我需要在post方法中对某些有效载荷的主体进行一些更改以更改诸如大写或小写的值。 我一直在研究最需要的是HandlerMethodArgumentResolver

@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LowerCase {

}

@Data
@Builder
@Document
@NoArgsConstructor
@AllArgsConstructor
public class Customer extends Model {

  @LowerCase
  private String email;

  @LowerCase
  private String username;
}

@RequestMapping(value = "user", method = RequestMethod.POST)
ResponseEntity<Customer> test(@RequestBody @Valid Customer payload) {
  System.out.println(payload);
  return ResponseEntity.ok(payload);
}

如果我发送此邮件

{
  "email": "IBARRAJJ@GMAIL.COM",
  "username": "JIBARRA"
}

需要的结果

{
  "email": "ibarrajj@gmail.com",
  "username": "jibarra"
}

谢谢

3 个答案:

答案 0 :(得分:2)

@Data
@Builder
@Document
@NoArgsConstructor
@AllArgsConstructor
public class Customer extends Model {

  @JsonDeserialize(using = ToLowerCaseDeserializer.class)
  private String email;

  @JsonDeserialize(using = ToLowerCaseDeserializer.class)
  private String username;
}

在ToLowerCaseDeserializer.java中,实现了将输入的文本转换为小写字母的逻辑

public class ToLowerCaseDeserializer extends StdDeserializer<String> {

    private static final long serialVersionUID = 7527542687158493910L;

    public ToLowerCaseDeserializer() {
        super(String.class);
    }

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        return _parseString(p, ctxt).toLowerCase();
    }

}

答案 1 :(得分:1)

您可以使用Spring 消息转换器对请求正文进行更改,为 Json转换器定义一个自定义转换器(转换为< strong> JSON 到对象),并按如下所示进行添加以进行春季启动。

要编写消息转换器,请扩展Spring AbstractHttpMessageConverter(用于新的自定义转换器),并重写readInternal(),writeInternal()和supports()三种方法。

  

Spring使用HttpMessageConverters渲染@ResponseBody(或   @RestController的响应)。您可以额外贡献   通过在Spring Boot中添加适当类型的bean来实现转换器   上下文。如果您添加的bean是本应包含的类型   无论如何还是默认情况下(例如MappingJackson2HttpMessageConverter   JSON转换),它将替换默认值。方便豆   提供了类型为HttpMessageConverters的,如果以下情况始终可用   您使用默认的MVC配置。它有一些有用的方法   访问默认的和用户增强的消息转换器(例如,   如果您想手动将它们注入到自定义中,这可能会很有用   RestTemplate)。

@Configuration
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
    HttpMessageConverter<?> additional = ...
    HttpMessageConverter<?> another = ...
    return new HttpMessageConverters(additional, another);
}

}

相似的帖子:Spring boot how to custom HttpMessageConverter

参考答案: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-responsebody-rendering

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html#boot-features-spring-mvc-message-converters

答案 2 :(得分:0)

只需在控制器中进行即可。我不认为消息转换器是转换数据的地方

转换案例意味着某种业务约束或规则。因此,我认为您希望在控制器的代码中显式地发生这种情况,而不是注释的某些属性。然后了解需求的变化(因为需求总是变化),您就知道在哪里以及如何进行变化。