【问题标题】:subresources problem with dependencies in JAVAJAVA中依赖关系的子资源问题
【发布时间】:2018-11-27 20:10:00
【问题描述】:

当我创建子资源时,我的 Injection (authenticatedUser) 为空。但是在根类(authenticatedUser)中,Injection 具有正确的值。因此,当我使用

/medicos/我

我得到了正确的值,但是当我使用时

/medicos/me/pacientes

我从子资源 PacienteResource 中的 authenticatedUser 收到一个错误 null。 我不明白以及如何解决子资源中的这种依赖关系。这个依赖(authenticatedUser)是在认证过滤器中产生的。

@Path("/medicos")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class MedicoResource {

    @Inject
    @AuthenticatedUser
    Usuario authenticatedUser;

    @GET
    @Path("me")
    @Produces(MediaType.TEXT_PLAIN)
    public Response getMedico() {
        return Response.ok(authenticatedUser.getMedico().getNombre()).build();
    }

    @Path("/me/pacientes")
    public PacienteResource getMedicoPacientes() {
        System.out.println("get medico pacientes");
        return new PacienteResource();//This is the problem.
    }
}

子资源类也有authenticatedUser,但是我用的时候这个是null。

public class PacienteResource {

    @Inject
    @AuthenticatedUser
    private Usuario authenticatedUser;

    @Inject
    PacienteService pacienteService;

    @GET
    @RolesAllowed({"MEDICO"})
    public Set<Paciente> getPacientes() {
        Set<Paciente> pacientes = authenticatedUser.getMedico().getPacienteSet();
        return pacientes;
    }
}

这是我的@AuthenticatedUser 制作人。过滤器“Authentification”为这个观察者“handleAuthenticationEvent”抛出一个事件。然后,当我需要一个经过身份验证的用户时,我只应该注入一个@AuthenticatedUser。但是当我创建 pacienteResource 的新实例时,没有生成 AuthenticatedUser。

@RequestScoped
public class AuthenticatedUserProducer {   

    @Inject
    private UsuarioService usuarioService;

    private Usuario authenticatedUser;

    public void handleAuthenticationEvent(@Observes @AuthenticatedUser String username) {
        this.authenticatedUser = findUser(username);
    }

    private Usuario findUser(String username) {
        Usuario usuario = usuarioService.findByUserName(username);
        return usuario;
    }

    @Produces
    @RequestScoped
    @AuthenticatedUser
    public Usuario createLogger() {
        return authenticatedUser;
    }
}

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER})
public @interface AuthenticatedUser {

}

【问题讨论】:

  • 问:您是否有机会通过MCVE 重现该问题?问:您的开发/运行时环境是什么(例如 Eclipse?Tomcat?Jersey?Spring Boot?)
  • JAX-RS 和我的服务器是 WildFly
  • 有趣 - 我不知道 JBoss 有一个新家(Redhat,现在是 IBM)和一个新名称(WilldFly)。建议:看看这是否有帮助:stackoverflow.com/questions/40225429/…
  • 但是我有一个authenticatedUser的生产者,问题是这里“return new PacienteResource();”新对象不是用 authenticatedUser 创建的,生产者没有产生一个 authenticatedUser。
  • 顺便说一句,您的子资源类不应使用@Path 进行注释。如果您启用了类路径扫描,那么它会将子资源类注册为根资源类(您不想要)。

标签: java rest jax-rs cdi


【解决方案1】:

我以这种方式找到了解决方案:我注入对象而不是在运行时创建新实例。我不太了解它是如何工作的,但它确实有效。

@Path("/medicos")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class MedicoResource {

    @Inject//Injection instead of create a new instance.
    PacienteResource pacienteResource;

    @Inject
    @AuthenticatedUser
    Usuario authenticatedUser;

    @GET
    @Path("me")
    @Produces(MediaType.TEXT_PLAIN)
    public Response getMedico() {
        return Response.ok(authenticatedUser.getMedico().getNombre()).build();
    }

    @Path("/me/pacientes")
    public PacienteResource getMedicoPacientes() {
        return PacienteResource;// Problem solved.
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 2020-01-10
    • 2015-08-07
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    相关资源
    最近更新 更多