JAVA中存在依赖关系的子资源问题



当我创建子资源时,我的Injection(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"抛出一个事件,用于此Observer"handleAuthenticationEvent"。然后,当我需要一个authenticatedUser时,我只需要注入一个@authenticatedUser。但是,当我创建pacientResource的新实例时,不会生成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.
}
}

最新更新