【发布时间】:2019-01-15 04:44:54
【问题描述】:
我的“命令”中有一些验证,控制器的参数在每个属性的集合内执行,问题是没有通知属性,杰克逊没有调用 set 方法进行验证。是否可以强制 Jackson 在缺少属性的情况下调用 Set 方法?
例如 Payload 没有代理字段:
{
"bank": "237",
"account": "20772-1",
"taxId": "36456155800",
"paidAmount": 30.00
}
我的控制器:
public Return confirmTransfer(@RequestBody RechargeTransferConfirmationCommand command) {
System.out.println(command);
}
Java 类:
public class RechargeTransferConfirmationCommand {
public static final String ERR_INVALID_AGENCY = "Agency number can not be null.";
private String bank;
private String account;
private String agency;
private String taxId;
public RechargeTransferConfirmationCommand(BigDecimal paidAmount, String bank, String account,
String agency, String taxId) {
setPaidAmount(paidAmount);
setBank(bank);
setAccount(account);
setAgency(agency);
setTaxId(taxId);
}
public void setRechargeId(RechargeId rechargeId) {
assertArgumentNotNull(rechargeId, Recharge.ERR_RECHARGE_ID_INVALID);
this.rechargeId = rechargeId;
}
private void setPaidAmount(BigDecimal paidAmount) {
if (paidAmount == null || paidAmount.compareTo(BigDecimal.ZERO) < 0)
throw new IllegalArgumentException(Recharge.ERR_INVALID_AMOUNT);
this.paidAmount = paidAmount;
}
private void setBank(String bank) {
assertArgumentNotEmpty(bank, TransferInformation.ERR_INVALID_BANK_NUMBER);
this.bank = bank;
}
private void setAccount(String account) {
assertArgumentNotEmpty(account, TransferInformation.ERR_INVALID_ACCOUNT);
this.account = account;
}
private void setAgency(String agency) {
assertArgumentNotEmpty(agency, ERR_INVALID_AGENCY);
this.agency = agency;
}
private void setTaxId(String taxId) {
assertArgumentNotEmpty(taxId, ERR_INVALID_TAX_ID);
this.taxId = taxId;
}
}
在这种情况下,对于每个字段,都会调用 set 方法进行验证,除了负载中未通知的代理字段,它应该很快抛出方法 assertArgumentNotEmpty 中包含的异常。
【问题讨论】:
-
为什么不使用
@NotNull和@Min注释来处理验证? -
因为使用这个注解,客户端的返回对象是特定于框架的,我需要一个自定义的返回。这是我的异常,我可以在 @ControllerAdvice 类中捕获并返回更友好的响应。
-
如果您的 javax 验证失败,那么您可以拦截 @ControllerAdvice。即使在 javax 验证中,您也可以使用传递验证失败消息的消息
标签: java spring-mvc spring-boot jackson