gpt4 book ai didi

jax-rs - 使用 JAX-RS 进行 Bean 验证(rest-easy): parameter name not recognized

转载 作者:行者123 更新时间:2023-12-04 15:40:08 24 4
gpt4 key购买 nike

我将 JAX-RS 资源与 Bean Validation 以及这两项工作之间的集成按预期使用。

但是,在验证错误报告参数名称为 arg0 的情况下生成的默认错误消息,像这样

[PARAMETER]
[login.arg0.password]
[password is required]
[]

对应方法定义:
@POST //and other JAX-RS annotations
public Response login(
@NotNull
@Valid
LoginBody loginBody) {

[...]

protected static class LoginBody {

@NotNull(message = EMAIL_REQUIRED)
public String email;

@NotNull(message = PASSWORD_REQUIRED)
public String password;
}

虽然我通常对这种消息模式很好,但实际上是 annyoing 是原始参数名称无法识别的事实,即。 e.我更想看

登录。 登录正文 .password 而不是 arg0。

有没有一种简单的方法来解决这个问题,例如。 G。以某种方式为该参数提供一个明确的名称?

我正在使用 WildFly Swarm 2017.6.0。从我发现这意味着我有resteasy + resteasy-validator + hibernate-validator

谢谢。

最佳答案

有一个非常简单的解决方案:你可以在约束定义中设置自己的错误信息如下

@NotNull(message = "password is required")

如果您想要一个基于 JAX-RS 参数注释的更通用的解决方案,您可以实现自己的简单 ParameterNamProvider并在 validation.xml 中注册如下。这样做的好处是不必更改 jboss 模块结构。我也不必更改任何编译器标志...
public class AnnotatedParameterNameProvider implements ParameterNameProvider {
@Override
public List<String> getParameterNames(Constructor<?> constructor) {
return lookupParameterNames(constructor.getParameterAnnotations());
}

@Override
public List<String> getParameterNames(Method method) {
return lookupParameterNames(method.getParameterAnnotations());
}

private List<String> lookupParameterNames(Annotation[][] annotations) {
final List<String> names = new ArrayList<>();
if (annotations != null) {
for (Annotation[] annotation : annotations) {
String annotationValue = null;
for (Annotation ann : annotation) {
annotationValue = getAnnotationValue(ann);
if (annotationValue != null) {
break;
}
}

// if no matching annotation, must be the request body
if (annotationValue == null) {
annotationValue = "requestBody";
}
names.add(annotationValue);
}
}

return names;
}

private static String getAnnotationValue(Annotation annotation) {
if (annotation instanceof HeaderParam) {
return ((HeaderParam) annotation).value();
} else if (annotation instanceof PathParam) {
return ((PathParam) annotation).value();
} else if (annotation instanceof QueryParam) {
return ((QueryParam) annotation).value();
}
return null;
}
}

在validation.xml 中:
    <validation-config xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration validation-configuration-1.1.xsd"
version="1.1">
<parameter-name-provider>com.yourcompany.providers.AnnotatedParameterNameProvider</parameter-name-provider>
</validation-config>

请注意,您还可以通过实现自己的 MessageInterpolator 来自定义错误消息的格式。并在 validation.xml 中注册

关于jax-rs - 使用 JAX-RS 进行 Bean 验证(rest-easy): parameter name not recognized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45086048/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com