【发布时间】:2021-09-24 18:43:28
【问题描述】:
所以,我有以下控制器方法:
@RequestMapping(path = "/{application}/users", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public MyObject getUsers(@RequestParam("itemId") String itemId, @PathVariable("application") String application) {
return userService.get(itemId, application);
}
我想检查请求参数itemId是否存在于相关的应用程序中(在路径中)。
我的第一个想法是创建一个验证器:
@RequestMapping(path = "/{application}/users", method = RequestMethod.GET, produces =
MediaType.APPLICATION_JSON_VALUE)
@CheckItemId
public MyObject getUsers(@RequestParam("itemId") String itemId, @PathVariable("application") String application) {
return userService.get(itemId, application);
}
CheckItemId.java:
@Target({METHOD})
@Retention(RUNTIME)
@Constraint(validatedBy = CheckItemIdValidator.class)
@Documented
public @interface CheckItemId {
String message() default "error";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
CheckItemIdValidator.java:
@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class CheckItemIdValidator implements ConstraintValidator<CheckItemId, Object[]>{
@Override
public boolean isValid(Object[] arg0, ConstraintValidatorContext arg1) {
String itemId= (String) arg0[0];
String application = (String) arg0[1];
// Logic business ...
return true;
}
}
这个实现效果很好,我设法在验证器中获得了 itemId 和 application 值。我现在可以进行验证了。
我想知道是否有更好的方法来做类似的事情?由于我处理一个对象数组,我需要将其转换为字符串,如果我更改参数顺序,我将不会得到相同的值,因为我需要使用 arg0[0] 和 arg0[1]。
谢谢!
【问题讨论】:
-
这取决于业务逻辑。如果您正在执行简单的检查,例如(最小值或最大值检查、最大值或最小值检查、空值检查),那么您可以使用 hibernator 验证器 API。如果业务逻辑复杂,那应该没问题。
标签: spring validation methods parameters