【发布时间】: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进行注释。如果您启用了类路径扫描,那么它会将子资源类注册为根资源类(您不想要)。