创建子资源时,我的注入(authenticatedUser)为null。但是在根类(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 {

}

最佳答案

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

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

07-25 21:20