参数解析器之后的Java手动验证

Ric*_*ard 7 java validation rest spring hibernate

我有一个看起来像这样的休息控制器:

@RequestMapping(
        value = "/foo",
        method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<JsonNode> getFOOs(@Valid Payload payload) {
    /** some code **/
}
Run Code Online (Sandbox Code Playgroud)

这个Payload类看起来像这样:

@OneOrTheOther(first = "a", second = "b")
public final class Payload {
    private final String userName;
    private final String a;
    private final String b;
    @NotNull
    private final String c;
    @NotEmtpy{message="At least 1 item"}
    private List<String> names = new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)

ArgumentResolver看起来像这样:

public class PayloadArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().equals(Payload.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter,
                                  ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest,
                                  WebDataBinderFactory webDataBinderFactory) throws Exception {
        if(supportsParameter(methodParameter)) {
            HttpServletRequest requestHeader = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
            String userName = requestHeader.getHeader("userName");

            ObjectMapper mapper = new ObjectMapper();
            JsonNode requestBody = mapper.readTree(CharStreams.toString(requestHeader.getReader()));

            JsonNode a = requestBody.path("a");
            String a = a.isMissingNode() ? null : a.asText();

            JsonNode b = requestBody.path("b");
            String b = b.isMissingNode() ? null : b.asText();

            JsonNode c = requestBody.path("c");
            String c = c.isMissingNode() ? null : c.asText();

            JavaType type = mapper.getTypeFactory().constructCollectionType(ArrayList.class, String.class);
            List<String> ids
                    = requestBody.path("ids").isMissingNode()
                    ? null : mapper.readValue(requestBody.path("ids").toString(), type);


            return new Payload(username, a, b, c, ids);
        }
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

目前这大约是我想要它做的95%.它成功检索标题和请求正文中的所有项目并创建一个Payload对象.但是在创建对象后,我想运行在Payload类中注释的验证NotNull,NotEmpty或者我的客户验证器OneOrTheOther.

我做了一些挖掘,在这里这里找到了几个堆栈文章.我不知道如何实现第一个,第二个似乎过于复杂和繁琐,所以我不想真正走这条路.似乎使用该validateIfApplicable方法是可行的方法,但我将如何在我的上下文中调用它?

ben*_*n.d 2

您可以在您的类中添加一个 SmartValidator 实例。只需添加:

@Autowired
SmartValidator payloadValidator;
Run Code Online (Sandbox Code Playgroud)

注入后,您只需调用其验证方法,传递您的 bean 和错误列表。

以供参考:

SmartValidator:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/SmartValidator.html

错误:http ://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/validation/Errors.html