【问题标题】:How to ignore the @JsonProperty value while using the @RequestBody in controller to map value to DTO如何在控制器中使用 @RequestBody 将值映射到 DTO 时忽略 @JsonProperty 值
【发布时间】:2020-06-11 09:05:53
【问题描述】:

我想根据变量名而不是 @JsonProperty 值将我的 HTTP 请求参数值直接映射到我的 DTO USING @JsonProperty。我无法将该值映射到 DTO,因为它需要根据 JsonProperty 名称的请求值。无论如何在使用 @RequestBody 时禁用 @JsonProperty 值?

前端发送JSON:

{
"userId":"1",
"payMethod":"payMethod"
}

MyDto.class 公共类 MyDto{

    @JsonProperty(value = user_id, required = true)
    private String userId;


    @JsonProperty(value = BETAALMETHODE, required = true)
    private String payMethod;
//getter setter
   }

MyController.class

public class MyController{

  @RequestMapping(value = "payment", method = RequestMethod.PUT)
    public Integer PaymentUpdate(@RequestBody final MyDto myDto) throws JsonProcessingException {

}

【问题讨论】:

  • 如果你不打算使用JsonProperty,你为什么要首先定义它?
  • @lealceldeiro 我在一个不同的过程中使用这个属性,我使用 CSV 文件上传数据。

标签: java json spring data-binding jackson


【解决方案1】:

您可以通过对该 DTO 方法使用多个 setter 方法来做到这一点。例如

Payload:
{
"userId":"1",
"payMethod":"payMethod"
}

然后

MyDto.class public class MyDto{

@JsonProperty(value = user_id, required = true)
    private String userId;


    @JsonProperty(value = BETAALMETHODE, required = true)
    private String payMethod;

在 DTO 类中再添加一个与所需变量名称相关的 setter。

@JsonSetter("specifiedName")
void setUserId(String userId){
     this.userId=userId
}

void setPayMethod(String payMethod){ // Will work for "BETAALMETHODE" variable name
     this.payMethod=payMethod
}
@JsonSetter("payMethod")
void setPayMethod(String payMethod){
     this.payMethod=payMethod
}

这将解决您的问题,变量 payMethod 将在这两种情况下分配。

【讨论】:

  • 很好,但您在四个月后实施。
【解决方案2】:

在解析csv时可以使用JacksonMixin

public abstract class MyDtoMixin {
    @JsonProperty(value = user_id, required = true)
    private String userId;

    @JsonProperty(value = BETAALMETHODE, required = true)
    private String payMethod;
}


ObjectMapper mapper = new ObjectMapper(); // or CsvMapper mapper = new CsvMapper();
mapper.addMixInAnnotations(MyDto.class, MyDtoMixin.class);

【讨论】:

  • 感谢您的建议,但在这种情况下,我必须创建两个 DTO,我正在避免这种情况。 :)
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 2018-04-12
  • 2020-11-25
  • 1970-01-01
  • 2021-05-01
  • 2021-12-08
  • 1970-01-01
  • 2015-07-29
相关资源
最近更新 更多