Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Rest to JSF

Gostaria de criar um serviço REST e ao invés de consumir ou produzir algo, gostaria de buscar uma entidade e então iniciar um Bean com essa entidade e redirecionar o usuário a uma pagina(.xhtml que esta ligada ao bean)

Algo como:

    @Path("{tokenId}")
    @GET
    public ??? validaToken(@PathParam("tokenId") String token){
        Colaborador colaborador = dao.buscaToken(token);
        new ColaboradorBean().setColaborador(colaborador);
        //Redireciona o usuario para reset-pass.xhtml
        return ???;
    }

A ideia é o usuário receber via e-mail uma url com um token para resetar a senha, ao acessa a URL REST ele verá uma pagina do JSF que irá cuidar das alterações, como posso fazer essa transição do REST para o JSF?

6 respostas

Oi Pedro, você pode criar a URI no JAX-RS usando o UriBuilder:

URI redirectURI = UriBuilder.fromUri("http://localhost") .queryParam("algoDoColaborador", "valores").path("/algumPath").build();

e depois redirecionar:

@Path("{tokenId}")
    @GET
    public Response validaToken(@PathParam("tokenId") String token){
       Colaborador colaborador = dao.buscaToken(token);
       //Redireciona o usuario para reset-pass.xhtml

      URI redirectURI = UriBuilder.fromUri("http://localhost") .queryParam("idColaborador", colaborador.getId()).path("/algumPath").build();
        return Response.seeOther(redirectURI).build();;
    }

Só que na aquele ColaboradorBean vc precisa recarregar o colaborador, por isso tem a id como param. Isso tbm significa que vc precisa receber a id do colaborador no JSF através do GET que é possível.

Em fim, vc está misturando dois paradigmas e frameworks. Melhor seria só usar JSF ou só JAX-RS.

Obs: eu não testei o código :)

abs

Em breve, com a nova especificação do Java EE, você vai conseguir fazer exatamente o que quer, Pedro. Tem um exemplo nesse post do blog da caelum:

http://blog.caelum.com.br/primeiros-passos-do-mvc-1-0/

Mas no seu exemplo, porque precisa do JAX-RS afinal? Você está recebendo um token na requisição, buscando no dao, setando em um modelo e retornando uma view... você só precisa do JSF pra fazer isso.

Se no meio do caminho você precisar consumir algum recurso via JAX-RS, pode criar um resource do JAX-RS que faça o trabalho e usar o client api pra fazer a chamada pra esse serviço. Assim não mistura as responsabilidades. Faz sentido?

@Nico, estou fazendo justamente isso em um outro caso, mas realmente me enrolei por conta do parâmetro.

@Rodrigo, desculpe, não sabia que era possível fazer chamadas rest ao JSF, eu realmente preciso fazer exatamente o que você falou. Mas creio que isso seja topico para JSF, então vou pesquisar sobre Grato.

Oi Pedro, na verdade não dá pra fazer chamadas REST ao JSF mesmo, o que quis dizer é que se no seu managed bean do JSF você precisar fazer chamadas REST, você pode isolar isso numa classe e usar a API do JAX-RS pra fazer isso. De forma parecida como o Nico te disse, por exemplo:

@Stateless
public class ColaboradorRestClient {

       private URI uri;
       private Client client;

       public ColaboradorRestClient() {
             uri = UriBuilder
             .fromUri("http://localhost:8080")
             .port(8080).build();              
             client = ClientBuilder.newClient();
       }

       public String add(Colaborador colaborador){
             Response response = client.target(uri)
             .request()
             .post(Entity.entity(colaborador,MediaType.APPLICATION_JSON));
             return response.getStatusInfo().getReasonPhrase();
       }

       public List<Colaborador> getColaboradores(){
             List<Colaborador> colaboradores = client.target(uri)
             .request()
             .get(new GenericType<List<Colaborador>>(){});
             return colaboradores;
       }

       public void close(){
             client.close();
       }
}

Assim você pode receber o ColaboradorRestClient injetado no seu bean do JSF e encapsular as chamadas REST nele. Sabe?

Desculpa Rodrigo, mas agora eu realmente me perdi. Eu basicamente pegaria essa classe e injetaria ela no meu Bean e como eu usaria ela exatamente? Não consegui entender a figura como um todo...

solução!

você receberia as informações em seu bean do jsf, e usaria esse rest client pra manipular os recursos que voc6e precisa por jax-rs. Tipo:

@ManagedBean
public class ColaboradorBean {

    @Inject 
    private ColaboradorRestClient client;

    private Colaborador colaborador; 

    public void adiciona() {
        client.adiciona(this.colaborador);
        // outras coisas que você quiser fazer
    }

    // outros métodos do seu bean
}

A ideia é, se você realmente precisa usar os dois, você pode isolar o cliente jax-rs e usar ele por dentro do seu managed bean do jsf. Mas são raros os casos em que você verdadeiramente precisa fazer isso