JAVA中具有依赖项的子资源问题

时间:2018-11-27 20:10:01

标签: java rest jax-rs cdi

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

  

/ medicos / me

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

  

/ 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时,我只应该注入@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 {

}

1 个答案:

答案 0 :(得分:0)

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

@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.
    }
}