Tôi có một bộ điều khiển phần còn lại trông như thế này:Java Validation tay sau Argument Resolver
@RequestMapping(
value = "/foo",
method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<JsonNode> getFOOs(@Valid Payload payload) {
/** some code **/
}
Lớp Payload
trông như thế này:
@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>();
}
Và ArgumentResolver trông như thế này:
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;
}
}
Hiện tại, điều này có nghĩa là khoảng 95% những gì tôi muốn. Nó lấy thành công tất cả các mục từ phần đầu và phần thân yêu cầu và tạo ra một đối tượng Payload
. Nhưng sau khi tạo đối tượng, tôi muốn chạy các xác thực được chú thích trong lớp Payload
như NotNull
, NotEmpty
hoặc trình xác thực khách hàng của mình OneOrTheOther
.
Tôi đã thực hiện một số thao tác xung quanh và tìm thấy một số bài viết chồng here và here. Tôi không biết làm thế nào để thực hiện một trong những đầu tiên và thứ hai có vẻ quá phức tạp và rườm rà nên tôi không muốn thực sự đi con đường đó. Có vẻ như sử dụng phương pháp validateIfApplicable
là cách để đi nhưng tôi sẽ gọi nó như thế nào trong ngữ cảnh của mình?
Hãy xem sau http: // stackoverflow.com/questions/18091936/spring-mvc-valid-validation-with-custom-handlermethodargumentresolver?noredirect=1&lq=1 –
Có lẽ bạn có thể sử dụng các xác thực JSR-303 của Spring3, dễ dàng hơn để đáp ứng nhu cầu của bạn, và ArgumentResolver không cần thiết. – TTCC