在发布这个问题之前,我已经做了很多研究并尝试了很多可用的解决方案。
这是我陷入的棘手情况。
我有一个 Spring 控制器,它有多个请求映射,它们都有 @PathVariables
控制器如下所示:
@Controller
@EnableWebMvc
public class ChildController extends ParentController<InterfaceController> implements InterfaceController{
@Override
@RequestMapping(value = "/map/{name}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET)
@ResponseStatus( HttpStatus.OK)
@ResponseBody
public List<Friends> getAllFriendsByName(
@PathVariable("name") String name,
@RequestParam(value="pageSize", required=false) String pageSize,
@RequestParam(value="pageNumber", required=false) String pageNumber,
HttpServletRequest request) throws BasicException {
//Some logic over here;
return results;
}
@Override
@RequestMapping(value = "/map/{id}", produces = "application/json; charset=UTF-8", method = RequestMethod.GET)
@ResponseStatus( HttpStatus.OK)
@ResponseBody
public List<Friends> getAllFriendsById(
@PathVariable("id") String id,
@RequestParam(value="pageSize", required=false) String pageSize,
@RequestParam(value="pageNumber", required=false) String pageNumber,
HttpServletRequest request) throws BasicException {
//Some logic over here;
return results;
}
}
现在我最近了解到,您无法在 Spring 中验证路径变量,与我尝试过的这些示例相反,事实证明它不起作用
(尝试过的例子:Spring 4 中的 @PathVariable 验证 https://stackoverflow.com/questions/35403744/pathvariable-validation-in-spring-4)
所以我想到向我的路径变量添加自定义 JSR303 约束验证并创建我自己的东西,例如
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = PathVariableValidator.class)
@Documented
public @interface RequestValidationNeeded {
String id();
String name();
Class<?>[] constraints() default {};
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
String message() default "totally wrong, dude!";
}
这不是我最初的想法,它的灵感来自这篇文章http://techblogs4u.blogspot.ca/2012/09/method-parameter-validation-in-spring-3.html http://techblogs4u.blogspot.ca/2012/09/method-parameter-validation-in-spring-3.html
我无法弄清楚如何将 @RequestValidationNeeded 注释映射到两个 PathVriables,即id
and name
并调用相同的验证器,并根据调用验证器的字段调用适当的验证。
我不喜欢这种方式,但我的选择已经用尽,这是我能想到的最后一件事可能会起作用,但即使如此,我也需要找到一种方法来用相同的注释来注释两个路径变量并调用相同的验证器。
我将不胜感激任何形式的帮助或指导。
我根据我的尝试发布的其他一些问题可能会帮助您更好地了解我尝试过的验证。
附:我发布链接而不是代码只是为了使问题简短。
Links:
如何使 Spring 中的 customEditor 足够动态以调用适当方法的验证 https://stackoverflow.com/questions/37849617/how-to-make-customeditor-in-spring-dynamic-enough-to-call-validation-on-appropri
Spring REST 服务控制器未通过 @PathVariable 和 @Valid 进行验证 https://stackoverflow.com/questions/37849150/spring-rest-service-controller-not-being-validate-by-pathvariable-and-valid