首页 > 解决方案 > 如何在到达带有注释的句柄之前转换 Requestbody 的字段

问题描述

我需要在 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": "MYMAIL@GMAIL.COM",
  "username": "JIBARRA"
}

需要这个的结果

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

谢谢

标签: javaspring-boot

解决方案


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

}

推荐阅读