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

Java 如何在到达带有注释的句柄之前转换Requestbody的字段,java,spring-boot,Java,Spring Boot,我需要在post方法中对一些有效负载的主体进行一些更改,以更改值​​像大写或小写。 我一直在研究最接近我需要的是HandlerMethodArgumentResolver @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface LowerCase { } 需要这样的结果 { "email": "mymail@gmail.com", "username"

我需要在post方法中对一些有效负载的主体进行一些更改,以更改值​​像大写或小写。 我一直在研究最接近我需要的是HandlerMethodArgumentResolver

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

}


需要这样的结果

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

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

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

  @JsonDeserialize(using = ToLowerCaseDeserializer.class)
  private String username;
}
在ToLowerCasedSerializer.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();
    }

}
公共类ToLowerCasedSerializer扩展了StdDeserializer{
私有静态最终长serialVersionUID=7527542687158493910L;
公共ToLowerCasedSerializer(){
super(String.class);
}
@凌驾
公共字符串反序列化(JsonParser p,DeserializationContext ctxt)引发IOException,JsonProcessingException{
返回_parseString(p,ctxt).toLowerCase();
}
}
在ToLowerCasedSerializer.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();
    }

}
公共类ToLowerCasedSerializer扩展了StdDeserializer{
私有静态最终长serialVersionUID=7527542687158493910L;
公共ToLowerCasedSerializer(){
super(String.class);
}
@凌驾
公共字符串反序列化(JsonParser p,DeserializationContext ctxt)引发IOException,JsonProcessingException{
返回_parseString(p,ctxt).toLowerCase();
}
}

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


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

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


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

您可以使用Spring消息转换器对请求正文进行更改,为Json转换器定义一个自定义转换器(将Json转换为对象)然后像下面那样为spring boot添加它

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

Spring使用HttpMessageConverters呈现@ResponseBody(或 来自@RestController)的响应。你可以贡献更多 通过在Spring Boot中添加适当类型的bean来实现转换器 上下文如果您添加的bean属于本应包含的类型 默认情况下(例如映射Jackson2HttpMessageConverter for JSON转换),它将替换默认值。方便豆 提供了HttpMessageConverters类型,并且在以下情况下始终可用: 您使用默认的MVC配置。它有一些有用的方法 访问默认和用户增强的消息转换器(例如, 如果您想手动将它们注入到自定义的 REST模板)

@配置
公共类MyConfiguration{
@豆子
公共HttpMessageConverters customConverters(){
HttpMessageConverter附加=。。。
HttpMessageConverter另一个=。。。
返回新的HttpMessageConverters(附加的,另一个);
}
}
类似职位:

参考答案:


您可以使用Spring消息转换器对请求正文进行更改,为Json转换器定义一个自定义转换器(它将Json转换为对象),并像下面那样为Spring boot添加它

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

Spring使用HttpMessageConverters呈现@ResponseBody(或 来自@RestController)的响应。你可以贡献更多 通过在Spring Boot中添加适当类型的bean来实现转换器 上下文如果您添加的bean属于本应包含的类型 默认情况下(例如映射Jackson2HttpMessageConverter for JSON转换),它将替换默认值。方便豆 提供了HttpMessageConverters类型,并且在以下情况下始终可用: 您使用默认的MVC配置。它有一些有用的方法 访问默认和用户增强的消息转换器(例如, 如果您想手动将它们注入到自定义的 REST模板)

@配置
公共类MyConfiguration{
@豆子
公共HttpMessageConverters customConverters(){
HttpMessageConverter附加=。。。
HttpMessageConverter另一个=。。。
返回新的HttpMessageConverters(附加的,另一个);
}
}
类似职位:

参考答案:


将StdDeserializer public扩展到LowerCasedSerializer(){super(String.class);}@Override public String反序列化(JsonParser p,DeserializationContext context)抛出IOException,JsonProcessingException{return(return)parseString(p,context).toLowerCase();}它是反序列化而不是序列化的。我已经编辑了我的答案,并给出了ToLowerCasedSerializer implatendstDeserializer public ToLowerCasedSerializer(){super(String.class);}@Override public String反序列化(JsonParser p,DeserializationContext)抛出IOException,JsonProcessingException{return(p,context).toLowerCase();}它是反序列化的,而不是序列化的。我已经编辑了我的答案,并给出了ToLowerCasedSerializer
@Data
@Builder
@Document
@NoArgsConstructor
@AllArgsConstructor
public class Customer extends Model {

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

  @JsonDeserialize(using = ToLowerCaseDeserializer.class)
  private String username;
}
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();
    }

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

}