Springboot@带有String对象的有效注释



因此,我有以下控制器方法:

@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)

最新更新