因此,我有以下控制器方法:
@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和应用程序的值。我现在可以进行验证了。
我想知道是否有更好的方法来做这样的事情?由于我处理Object的数组,我需要将其强制转换为String。如果我更改参数顺序,我将不会得到相同的值,因为我需要使用arg0[0]和arg0[1]。
谢谢!
您可以使用spring验证库。在控制器级别添加@Valid
。然后在方法级别上添加@NotBlank
,如下所示。
getUsers(@RequestParam("itemId") @NotBlank String itemId)