Şöyle bir dinlenme denetleyicisi vardır:Java Manuel Doğrulama
@RequestMapping(
value = "/foo",
method = RequestMethod.POST)
@ResponseBody
public ResponseEntity<JsonNode> getFOOs(@Valid Payload payload) {
/** some code **/
}
Payload
sınıf şuna benzer:
@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>();
}
Ve ArgumentResolver şuna benzer:
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;
}
}
Şu anda bunu yapmak istediğimin yaklaşık% 95'ini yapıyor. Başlıkta tüm öğeleri başarıyla alır ve gövde isteğinde bulunur ve Payload
nesnesini oluşturur. Ancak, nesneyi oluşturduktan sonra, sınıfındaki NotNull
, NotEmpty
veya müşteri doğrulama aracısı OneOrTheOther
gibi açıklamaları çalıştırmak istiyorum.
Bazı kazma yaptım ve birkaç yığın makale here ve here. İlkini nasıl uygulayacağımı bilmiyorum ve ikincisi aşırı karmaşık ve hantal görünüyor, bu yüzden o rotaya gitmek istemiyorum. validateIfApplicable
yöntemini kullanmanın yolu gibi görünüyor, ancak bağlamımda nasıl arayabilirim?
aşağıdaki http bakın: // stackoverflow.com/questions/18091936/spring-mvc-valid-validation-with-custom-handlermethodargumentresolver?noredirect=1&lq=1 –
Belki de taleplerinizi karşılamak için daha kolay olan Spring3'ün JSR-303 doğrulamasını kullanabilirsiniz ve ArgumentResolver gerekli değil. – TTCC