创建子资源时,我的注入(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.
}
}