проблема субресурсов с зависимостями в JAVA - PullRequest
0 голосов
/ 27 ноября 2018

Когда я создал свой подресурс, мой Injection (authenticatedUser) является нулевым.Но в корневом классе (authenticatedUser) у Injection были правильные значения.Поэтому, когда я использовал

/ medicos / me

, я получаю правильные значения, но когда я использовал

/ medicos / me/ pacientes

Я получаю нулевую ошибку от authenticatedUser в подресурсе PacienteResource.Я не понимаю, и как я могу решить эту зависимость в подресурсе.Эта зависимость (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.Фильтр «Аутентификация» генерирует событие, для этого наблюдателя «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 {

}

1 Ответ

0 голосов
/ 29 ноября 2018

Я нашел решение следующим образом: я внедряю объект вместо создания нового экземпляра во время выполнения.Я не очень хорошо понимаю, как это работает, но это работает.

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