Java 为什么在自定义ConstraintValidator中注入的值有时为空?

Java 为什么在自定义ConstraintValidator中注入的值有时为空?,java,jakarta-ee,ejb,ejb-3.0,stateless-session-bean,Java,Jakarta Ee,Ejb,Ejb 3.0,Stateless Session Bean,我创建了一个名为APIAuth的自定义ConstraintValidator注释, 我尝试使用@Context HttpServletRequest获取远程用户IP地址,但问题是在我的无状态内调用APIAuth时,APIAuth自定义验证程序工作,它获取远程用户IP地址,但当我尝试再次快速刷新请求时,它抛出异常,因为@Context HttpServletRequest在这种情况下为null,所以我需要等待几秒钟,然后再次尝试请求无状态Restful 我的APIAuth代码: APIAuth.c

我创建了一个名为APIAuth的自定义ConstraintValidator注释, 我尝试使用@Context HttpServletRequest获取远程用户IP地址,但问题是在我的无状态内调用APIAuth时,APIAuth自定义验证程序工作,它获取远程用户IP地址,但当我尝试再次快速刷新请求时,它抛出异常,因为@Context HttpServletRequest在这种情况下为null,所以我需要等待几秒钟,然后再次尝试请求无状态Restful

我的APIAuth代码:

APIAuth.class

@Documented
@Constraint(validatedBy = APIAuthValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface APIAuth {
    String message() default "";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
APIAuthValidator.class

public class APIAuthValidator implements ConstraintValidator<APIAuth, String> {

@Context
private HttpServletRequest client;

@Override
public void initialize(APIAuth constraintAnnotation) {
}

@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
    boolean valid = "127.0.0.1".equals(client.getRemoteAddr());

    return valid;
}
注意:我还注意到,当我首先在initialize构造函数中定义远程用户ip地址时,它会缓存该值,并且在几秒钟后不会更新它,尽管刷新了多次包含自定义注释调用的Restful无状态API类的请求


谢谢,

您应该返回“有效”,而不是“真实”。你的代码甚至不起作用。这可能与您正在测试IP地址的事实无关。您好,我编辑了我的帖子,当然我返回了“valid”,但我测试的目的是确定错误在哪里,我还可以使用此自定义验证器,而不仅仅是确定远程用户IP,它们是否有效?还是表现出同样的行为?你真的有证据表明它得到的IP地址是导致故障的原因吗?是的,这一行引起的问题是:client.getRemoteAddr,当自定义验证程序第一次运行时,client.getRemoteAddr返回远程IP地址correclty,但当尝试一次又一次地调用它时,然后对象“client”将为null,因此当从该对象调用子方法getRemoteAddr时,会导致错误。。为了避免这个错误,在再次调用自定义验证器之前,我必须在2到5秒之间等待几秒钟。因此,真正的问题是根本无法获取IP地址。那只是一种症状。值得注意的是,“client”可以为null。我建议你相应地修改你的标题和问题。