Bean Validation
1.1引入了
ParameterNameProvider用于在创建约束违反对象时为方法和构造函数参数提供名称的接口。
Hibernate Validator
5.2引入了
ReflectionParameterNameProvider该类,该
ParameterNameProvider实现使用反射来获取实际的参数名称(为了正常工作,它要求使用
-parameters编译器参数来编译这些类):
public class ReflectionParameterNameProvider implements ParameterNameProvider { @Override public List<String> getParameterNames(Constructor<?> constructor) { return getParameterNames(constructor.getParameters()); } @Override public List<String> getParameterNames(Method method) { return getParameterNames(method.getParameters()); } private List<String> getParameterNames(Parameter[] parameters) { List<String> parameterNames = newArrayList(); for (Parameter parameter : parameters) { // If '-parameters' is used at compile time, actual names will be returned. Otherwise, it will be arg0, arg1... parameterNames.add(parameter.getName()); } return parameterNames; }}
Dropwizard对其进行了扩展,并添加了对JAX-RS
@XxxParam注释的支持,该注释
JerseyParameterNameProvider也应与其他JAX-
RS实现一起使用:
public class JerseyParameterNameProvider extends ReflectionParameterNameProvider { @Override public List<String> getParameterNames(Method method) { Parameter[] parameters = method.getParameters(); Annotation[][] parameterAnnotations = method.getParameterAnnotations(); List<String> names = new ArrayList<>(parameterAnnotations.length); for (int i = 0; i < parameterAnnotations.length; i++) { Annotation[] annotations = parameterAnnotations[i]; String name = getParameterNameFromAnnotations(annotations).orElse(parameters[i].getName()); names.add(name); } return names; } public static Optional<String> getParameterNameFromAnnotations(Annotation[] memberAnnotations) { for (Annotation a : memberAnnotations) { if (a instanceof QueryParam) { return Optional.of("query param " + ((QueryParam) a).value()); } else if (a instanceof PathParam) { return Optional.of("path param " + ((PathParam) a).value()); } else if (a instanceof HeaderParam) { return Optional.of("header " + ((HeaderParam) a).value()); } else if (a instanceof cookieParam) { return Optional.of("cookie " + ((cookieParam) a).value()); } else if (a instanceof FormParam) { return Optional.of("form field " + ((FormParam) a).value()); } else if (a instanceof Context) { return Optional.of("context"); } else if (a instanceof MatrixParam) { return Optional.of("matrix param " + ((MatrixParam) a).value()); } } return Optional.empty(); }}
如果不使用Dropwizard,则可以使用上面的代码创建自己的实现。
Validator可以使用
ValidationConfigclass
进行定制,以验证Jersey资源类/方法的使用,并通过以下
ContextResolver<T>机制将其公开:
public class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> { @Override public ValidationConfig getContext(final Class<?> type) { ValidationConfig config = new ValidationConfig(); config.parameterNameProvider(new CustomParameterNameProvider()); return config; }}
然后在
ValidationConfigurationContextResolver中注册
ResourceConfig。
有关更多详细信息,请参阅Jersey文档中有关Bean验证的支持。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)