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

problemas em acesso do REST via jquery

Boa Noite.

Estou estudando JAX-WS e estou com um problema, consigo consumir um Rest de outra aplicação, fiz uma classe java de teste em outro projeto e funcionou, mas ao tentar consumir o mesmo por JQuery obtive o seguinte erro de crossdmain, pesquisei em como habilitar no java, tentei varias soluções e nada.......

cheguei a ver a interface "ContainerResponseFilter" e nada, ao implementar a mesma obtive o mesmo retorno:

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
@Override
    public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException {
        response.getHeaders().add("Access-Control-Allow-Origin", "*");
        response.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        response.getHeaders().add("Access-Control-Allow-Credentials", "true");
        response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        response.getHeaders().add("Access-Control-Max-Age", "1209600");
    }

tambem tentei alterar o jquery para usar JSONP, mas não obtive sucesso....

estrnhamente com jsonp o console do navegador exibe o erro "Uncaught SyntaxError: Unexpected token :", mas ao clicar no link para me enviar a linha de erro ele me exibe o json montado, assim como nos meus testes em java:

{"lista_produtos":[{"preco":4000.0,"id":6237,"nome":"Videogame 4","quantidade":1},{"preco":60.0,"id":3467,"nome":"Jogo de esporte","quantidade":2}],"rua":"Rua Vergueiro 3185, 8 andar","cidade":"Sao Paulo","id":1}

formatado:

{
    "lista_produtos": [{
        "preco": 4000.0,
        "id": 6237,
        "nome": "Videogame 4",
        "quantidade": 1
    }, {
        "preco": 60.0,
        "id": 3467,
        "nome": "Jogo de esporte",
        "quantidade": 2
    }],
    "rua": "Rua Vergueiro 3185, 8 andar",
    "cidade": "Sao Paulo",
    "id": 1
}

codigo jquery:

$(document).ready(function() {
            $.ajax({
                url: "http://localhost:8080/TesteRest/ws/carrinhos/1",
                dataType: 'jsonp',
                crossDomain: true,
                type: 'GET'                
            }).then(function(data) {
                var atributos = {id: 'minhaDiv',class: 'minhaClasse',html: "data"};
                $('<li>', atributos).appendTo('#corpo');
            });
        });

codigo rest:

@Path("{id}")
    @GET
    @Produces({MediaType.APPLICATION_JSON, "application/json", "application/javascript"})
    public String busca(@PathParam("id") Long id){
        String ret = "";
        List<Carrinho> listaBanco = null;
        if(id==0){
            Gson json = new Gson();
            listaBanco = new CarrinhoDAO().getListaBanco();
            ret = json.toJson(listaBanco); 
        }else{
            Carrinho carrinho = new CarrinhoDAO().busca(id);
            ret = carrinho.toJson();
        }
        return ret;
    }

gostaria de saber se tem algum detalhe q perdi em minha busca, ou onde eu errei......

se possível gostaria de saber fazer de ambas as formas, pesquisei mas nada q achei funcionou.....

3 respostas

Você habilitou o uso desse filtro no web.xml de configuração da servlet do jersey? Seria algo assim:

    <init-param>
        <param-name>
            com.sun.jersey.spi.container.ContainerResponseFilters
        </param-name>
        <param-value>
        nomeCompletoDaSuaClasseDeFiltro
        </param-value>
    </init-param>

Boa Tarde,

Não estou usando jersey, pois com ele o meu projeto nao dava deploy no JBoss 7, o jersey só funcionava no wildfly, como o jboss ainda é muito utilizado eu sempre testo o q faço nos 2, então adotei o restEasy.

não sabia da necessidade de um filtro para fazer um cross domain

solução!

Gostaria de agradecer a paciência e dedicação do instrutor, sério ajudou muito.....

estou postando aqui como fiz o filtro e o jquery pra quem passar por esse problema saber como resolver, obrigado Alberto Souza.

mas deixo uma sugestão também, minha sugestão é que coloque uma aula a mais no curso de JAX-RS falando sobre como fazer o cross domain, to a uns dias tentado fazer isso, fez uma falta essa aula.............

filtro Java:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author arc-c
 */
public class CORSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Origin", "*");
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Headers", "token, origin, content-type, accept, authorization");
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Credentials", "true");
        ((HttpServletResponse) response).addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        ((HttpServletResponse) response).addHeader("Access-Control-Max-Age", "1209600");


        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {

    }

}

Jquery:

<script>
            $(document).ready(function() {
                $.ajax({
                    url: "http://localhost:8080/TesteRest/ws/carrinhos/1",
                    dataType: 'json',
                    contentType: "application/json;",
                    header : "token",
                    type: 'GET'                
                }).then(function(data) {
                    alert(data);
                    var atributos = {id: 'minhaDiv',class: 'minhaClasse',html: "data"};
                    $('<li>', atributos).appendTo('#corpo');
                });
            });
        </script>