使用 JAX-RS 进行 Bean 验证(rest-easy):无法识别参数名称

2023-11-27

我将 JAX-RS 资源与 Bean 验证一起使用,并按预期在这两个工作之间进行集成。

但是,在验证错误报告参数名称为 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;
}

虽然我通常对这种消息模式感到满意,但实际上令人烦恼的是原始参数名称无法识别,即。 e.我更想看看

login.登录正文.password 代替arg0.

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

我使用的是WildFly Swarm 2017.6.0。据我所知,这意味着我有resteasy + Resteasy-validator + hibernate-validator

Thanks.


您可以尝试使用以下命令编译您的应用程序-parameters或指示您的 IDE 执行此操作,例如的情况下 eclipse:首选项 -> java -> 编译器 ->“存储有关方法参数的信息(可通过反射使用)”

完成后,您需要指示 Bean Validation 基础设施(例如 hibernate-validator) 使用ReflectiveParameterNamer via META-INF/validation.xml.

<parameter-name-provider>org.hibernate.validator.parameternameprovider.ReflectionParameterNameProvider</parameter-name-provider>

也可以看看Hibernate 验证器配置

我得到了可靠的东西参数库

META-INF/validation.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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">
   <default-provider>org.hibernate.validator.HibernateValidator
   </default-provider>
   <message-interpolator>org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator
   </message-interpolator>
   <traversable-resolver>org.hibernate.validator.internal.engine.resolver.DefaultTraversableResolver
   </traversable-resolver>
   <constraint-validator-factory>org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl
   </constraint-validator-factory>
   <parameter-name-provider>org.hibernate.validator.parameternameprovider.ParanamerParameterNameProvider</parameter-name-provider>
</validation-config>

To get paranamer与 Wildfly 合作我需要创建一个parameter-namerjboss模块 并从以下位置引用该模块module.xml of the hibernate-validator module.

有了这个,我就可以简单地写:

@POST
public Response login(@NotNull @Valid @Named("authRequest") AuthRequest authRequest) {
    return Response.ok().build();
}
...

public class AuthRequest {

    @NotNull(message = AuthMessages.EMAIL_REQUIRED)
    public String email;

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

对于通过以下方式发送的请求产生以下响应curl:

curl -H "Content-Type: application/json" -H "Accept: application/json" -d '{"email":"[email protected]"}' -v http://localhost:8080/javaweb-training/resources/auth

回复:

{"exception":null,"fieldViolations":[],"propertyViolations":[],"classViolations":[],"parameterViolations":[{"constraintType":"PARAMETER","path":"login.authRequest.password","message":"password.required","value":""}],"returnValueViolations":[]}%

... 笔记login.authRequest.password而不仅仅是login.arg0.password

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JAX-RS 进行 Bean 验证(rest-easy):无法识别参数名称 的相关文章

随机推荐