【问题标题】:JSON field Desrializing to lowercase in Spring BootJSON字段在Spring Boot中反序列化为小写
【发布时间】:2021-05-18 21:56:39
【问题描述】:

我有一个Spring Boot Controller -

@RestController
public class UserController {

   @PostMapping
   @ResponseStatus(CREATED)
   public UserResponse register( @Valid @RequestBody UserRequest userRequest) {
     //return ....
   } 
}

下面是UserRequest.java

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserRequest {

    private String email;
    //other property
}

我在请求正文中发送下面的 json -

 {
   "email" : "TEST@Example.com",
   //some other fields.
 }

有时客户端以大写或驼峰形式发送email,因此在userRquest 中,我想将email 字段的值更改为小写,例如test@example.com,同时反序列化为UserRequest 对象。

有什么简单的方法可以做到这一点。我可以介绍我自己的annotation@ToLowerCase 我如何创建自己的注释并在UserRequest 的字段级别使用它。

【问题讨论】:

  • 问题有点混乱,你能添加你试图解析的 UserRequest 类和示例 json 吗?

标签: spring-boot java-8 jackson jackson-databind


【解决方案1】:

Jackson 将在您的课程中使用 setter 方法。 在 setter 中执行小写转换。

例如

public void setEmail(String newValue)
{
    email = StringUtils.lowerCase(newValue);
}

StringUtils 是一个 apache 公共类。

【讨论】:

    【解决方案2】:

    仅仅引入一个新的注解@ToLowerCase没有简单的方法, 因为那样你还需要实现一些注释处理器 进行真正的转换工作。

    但是您可以通过稍微不同的方式实现您的目标。 在您的 UserRequest 类中注释 email 属性 使用@JsonDeserialize 并在此处指定converter

    @JsonDeserialize(converter = ToLowerCaseConverter.class)
    private String email;
    

    需要自己实现转换器类, 但是从StdConverter 扩展它很容易。

    public class ToLowerCaseConverter extends StdConverter<String, String> {
    
        @Override
        public String convert(String value) {
            return value.toLowerCase();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 2019-05-03
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多