3
respostas

Problemas com REST

Boa tarde, estou tendo problemas numa aplicação REST. Está gerando o seguinte erro:

The method received in the request-line is known by the origin server but not supported by the target resource.

POST http://localhost:8085/agendaContatoRest/rest/contatoRest/addContato 415

Pesquisei algumas coisas no tio google, mas ainda assim não consegui resolver o problema. Segue meu código.

package br.com.agendaContatoRest.rest;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.Consumes; // Define os tipos de mídia que os métodos de uma classe de recurso ou MessageBodyReader podem aceitar.
import javax.ws.rs.core.Response; // Define o contrato entre uma instância retornada eo tempo de execução quando uma aplicação precisa fornecer metadados para o tempo de execução.
import javax.ws.rs.POST; // Indica que o método anotado responde a solicitações HTTP POST.
import javax.ws.rs.Path; // Identifica o caminho URI que uma classe de recurso ou método de classe servirá pedidos para.
import javax.ws.rs.PathParam; // Vincula o valor de um parâmetro de modelo de URI ou um segmento de caminho que contém o parâmetro de modelo a um parâmetro de método de recurso
import javax.ws.rs.Produces; // Define tipos de midia que os métodos de classe podem produzir
import javax.ws.rs.core.MediaType; // Tipos de midia

import org.codehaus.jackson.map.ObjectMapper;

import br.com.agendaContatoRest.bd.conexao.Conexao;
import br.com.agendaContatoRest.jdbc.JDBCContatoDAO;
import br.com.agendaContatoRest.objetos.Contato;

@Path("contatoRest") // Caminho URI(Uniform Resource Identifier) da classe Rest utilizada
public class ContatoRest extends UtilRest {

    public ContatoRest(){

    }

    @POST // Processará as requisições enviadas pelo método post.

    /*
     * Caminho URI do método da classe que
     * receberá os dados do formulário que
     * os armazenará em sua respectiva classe
     * e os incluirá no banco de dados
     */
    @Path("/addContato")


    /*
     * Caminho URI que identifica o tipo de mídia 
     * enviado pelo lado cliente, no caso, informações do formulário
     * no formato de aplicação
     */
    @Consumes("apllication/*")

    public Response addContato(String contatoParam){
        try{
            /*
             * Instancia a classe ObjectMapper e chama o método readValue()
             * leitura dos valores repassados pelo cliente no formato JSON,
             * no caso os campos do formulário e atribui os valores destes
             * campos ao atributos da classe Contato.
             * Os valores obtidos do formulario são armazenos em atributos
             * javascript, esses atributos por sua vez devem obrigatoriamente
             * ter o mesmo nome dos atributos da classe Java correspondente
             * com isso é possivel a realização de um "de-para" dos valores 
             * contidos no objeto JSON(contatoParam) para um objeto da classe
             * Contato.
             * Aqui, importante observação de que o nome dos atributos declarados
             * na classe, que irão receber os valores dos campos do formulário,
             * sejam declarados de maneira identica ao nome dos campos do formulário
             * que enviará seus valores.
             */
            Contato contato = new ObjectMapper().readValue(contatoParam, Contato.class);

            // chamar o método que grava o objeto contato no banco de dados
            Conexao conec = new Conexao();
            Connection conexao = conec.abrirConexao();
            JDBCContatoDAO jdbcContato = new JDBCContatoDAO(conexao);
            jdbcContato.inserir(contato);
            conec.fecharConexao();

            /*
             * Envia como retorno para o método buildResponse() a mensagem
             * "Contato cadastrado com sucesso", no caso de sucesso da inclusão.
             * Também retorna para o método buildErrorResponse() uma mensagem
             * interna de erro, no caso do erro ocorrido durante a inclusão.
             */

            return this.buildResponse("Contato cadastrado com sucesso");
        }catch(Exception e){
            e.printStackTrace();
            return this.buildErrorResponse(e.getMessage());
        }
    }

}
package br.com.agendaContatoRest.rest;

import java.io.StringWriter;
import javax.ws.rs.core.Response; // Define o contrato entre uma instancia retornada e o tempo de execução
import javax.ws.rs.core.Response.ResponseBuilder; // Uma classe usada para instancias de respostas
import org.codehaus.jackson.map.ObjectMapper; // converte objetos para json e vice versa

public class UtilRest{

    /*
     * Abaixo o método responsável por enviar a resposta ao cliente sobre
     * a transação realizada, inclusão, consulta, edição ou exclusão,
     * realizadas com sucesso.
     * Repare que o método em questão aguarda que seja repassado um
     * conteúdo que será referenciado por um objeto result.
     */
    public Response buildResponse(Object result){
        /*
         * Cria a instância da Classe StringWriter para o objeto fw
         * Isto que este objeto é quem estará referenciando o conteúdo
         * repassado como resposta para o lado cliente.
         */
        StringWriter fw = new StringWriter();
        try{
            /*
             * Cria a instância da classe ObjectMapper para o objeto 
             * mapper
             */
            ObjectMapper mapper = new ObjectMapper();
            /*
             * Acessa o método writeValue, por meio do objeto mapper,
             * passando como parâmetro o objeto fw e o conteúdo do
             * objeto result, na realidade está criando um mapeando 
             * de dados onde o objeto fw é a chave do valor de um
             * conteúdo referenciado pelo objeto result.
             * result pode conter a mensagem, "Cadastro efetuado com 
             * sucesso", ou "Exclusao efetuado com sucesso" ou outra
             * qualquer dependendo de transação realizada.
             */
            mapper.writeValue(fw, result);
            /*
             * Monta o objeto de resposta com status 200 (ok), junto
             * com o objeto result convertido para JSON pelo objeto fw
             * para o cliente no formato String
             */
            return Response.ok(fw.toString()).build();
        } catch(Exception ex){
            return this.buildErrorResponse(ex.getMessage());
        }
    }

    /*
     * Abaixo o método responsável por enviar a resposta ao cliente sobre
     * A transação realizada, inclusão, consulta, edição ou exclusão. Ao cliente
     * não realizadas com sucesso, ou seja, que contenha algum erro.
     * Repare que o método em questão aguarda que seja repassado um 
     * conteúdo que será referenciado pelo por um objeto chamado rb.
     */
    public Response buildErrorResponse(String str){

        /*
         * Abaixo o objeto rb recebe o status do erro.
         */
        ResponseBuilder rb = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
        /*
         * Define a entidade (objeto), que neste caso é uma mensagem que será retornado para o cliente
         */
        rb = rb.entity(str);
        /*
         * Define o tipo de retorno desta entidade(objeto), no caso é definido como texto simples
         */
        rb = rb.type("text/plain");
        /*
         * Retorna o objeto de resposta com status 500(erro),
         * junto com a String contendo a mensagem de erro.
         */
        return rb.build();
    }
}
SENAI.contato = new Object();

$(document).ready(function(){

    SENAI.contato.cadastrar = function(){
        if(document.getElementById("nome").value         == ""     ||
            document.getElementById("endereco").value     == ""     ||
            document.getElementById("telefone").value     == ""     ||
            document.getElementById("email").value         == ""     ||
            document.getElementById("senha").value         == ""     ||
            document.getElementById("confirmaSenha").value == ""){

            alert("Todos os campos são obrigatórios de preenchimento!");
            return false;
        }

        var senha = document.getElementById("senha").value;
        var confirmaSenha = document.getElementById("confirmaSenha").value;

        if(senha != confirmaSenha){
            alert("Senhas não conferem");
            return false;
        }

        if(senha.lenght < 4 || senha.lenght > 8){
            alert("A senha está no tamanho incorreto");
            return false;
        }

        var email = document.getElementById("email").value;
        if(email.indexOf("@") == - 1 || // Valida se existe o @
            email.indexOf(".") == -1  || // Valida se existe o .
            email.indexOf("@") == 0 || // Valida se tem texto antes do @
            email.lastIndexOf(".") + 1 == email.lenght || //Valida se tem texto
            (email.indexOf("@") +1 == email.indexOf("."))){ // Valida se tem texto entre o @ e o .{
                alert("email incorreto");
                document.getElementById("email").focus();
                return false;
        } 


            /*
             * Cria o objeto newCont que, por sua vez, servirá de referência e acesso
             * aos campos do formulário, com seus respectivos valores, que serão enviados
             * via ajax para o lado do servidor para serem inseridos no banco de dados.
             * Os campos com seus respectivos valores serão empacotados no objeto
             * newCont e oportunamente este será repassado, juntamente com outras informações
             * e/ou parâmetros de configuração, para o ajax a fim de que este remeta-os
             * para o servidor a fim de que seja processado o cadastramento dos dados
             * deste formulário
             */
            var newCont = new Object();
            newCont.id               = $("#idUser").val();
            newCont.nome           = $("#nome").val();
            newCont.endereco       = $("#endereco").val();
            newCont.telefone       = $("#telefone").val();
            newCont.email           = $("#email").val();
            newCont.senha            = $("#senha").val();
            newCont.confirmaSenha = $("#confirmaSenha").val();

            var cfg = {
                    /*
                     * Abaixo a url repassada como referência
                     * para o acesso a Rest que contém, 
                     * dentre outros, o recurso que tratará de
                     * todo o processo para cadastramento dos dados
                     * do formulário.
                     */

                    url: "rest/contatoRest/addContato",
                    data: newCont,
                    success:function(msg){
                        var cfg = {
                                title: "Mensagem",
                                height: 250,
                                width: 400,
                                modal: true,
                                buttons:{
                                    "OK": function(){
                                        $(this).dialog("close");
                                    }
                                }
                        };
                        $("#msg").html(msg);
                        $("#msg").dialog(cfg);

                        // Atualiza a tabela de contatos
                        SENAI.contato.buscar();
                    }, // Fecha success
                    error: function(err){
                        alert("Erro ao cadastrar um novo contato "+ err.responseText);
                    } // Fechar error
            }; // Fechar estrutura obj cfg
            /*
             * Abaixo a chamada ao método post(), encontrado no
             * arquivo ajax.js, que ainda não implementou, mas
             * que, por sua vez, conterá os scripts
             * responsaveis por enviar as requisições dos dados 
             * de cadastramento, consulta, exclusao, edição
             * dos dados e receber a resposta do servidor estas requisições
             * Perceba que ao chamar o método enviamos como 
             * parâmetro a variavel cfg contendo os dados do formulário,
             * url estrutura de caixa de diálogo, 
             * mensagem de erro, dentre outros.
             */
            SENAI.ajax.post(cfg);

    }

    SENAI.contato.buscar = function(){
        var valorBusca = $("#consultarContato").val();
        SENAI.contato.exibirContatos(undefined, valorBusca);
    }
});
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>agendaContatoRest</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
      <servlet-name>Jersey REST Service</servlet-name>
      <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
      <init-param>
          <param-name>com.sun.jersey.config.property.packages</param-name>
          <param-value>br.com.agendaContatoRest.rest</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>Jersey REST Service</servlet-name>
      <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>
3 respostas

Opa, eu sei que o seu o código javascript parece que está enviando um post, entretanto o servidor está dizendo que não... para tirarmos a prova, o melhor é você ir no console do navegador e verificar as informações de envio. Faz isso e nos avisa?

Olá Maria, tudo bem?

Está me parecendo que o problema é por conta do

 @Consumes("apllication/*")

Tente substituir por

@Consumes("application/json")

Ajeite esse, era apenas um exercicio, agora estou desenvolvendo uma app, e deu o mesmo problema rssr, porém não consegui resolver da mesma forma que resolvi o outro, segue o código

package br.com.festivalRest.rest.authentication;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.Consumes;
import javax.ws.rs.core.Response;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.codehaus.jackson.map.ObjectMapper;

import br.com.festivalRest.bd.conexao.Conexao;
import br.com.festivalRest.jdbc.JDBCAuthenticationDAO;
import br.com.festivalRest.objetos.User;

@Path("authenticationRest")
public class AuthenticationRest extends UtilRest {

    public AuthenticationRest(){
    }

    @POST
    @Path("/foundUser")
    @Consumes("application/*")
    public Response foundUser(String contatoParam){
        System.out.println(contatoParam);
        try{

            User user = new ObjectMapper().readValue(contatoParam, User.class);

            Conexao conec = new Conexao();
            Connection conexao = conec.abrirConexao();
            JDBCAuthenticationDAO jdbcAuthentication = new JDBCAuthenticationDAO(conexao);
            jdbcAuthentication.foundUser(user);
            conec.fecharConexao();

            return this.buildResponse("OK");

        }catch(Exception e){
            e.printStackTrace();
            return this.buildErrorResponse("Falha");
        }
    }
}
function foundUser(){

    $.ajax({
        type: "POST",
        url: "rest/authenticationRest/foundUser",
        data: $("#authentication").serialize(),
        success:function(date){
            alert("Teste");
        },error(err){
            console.log(err);
            alert("Erro ao processar a requisição " + err.responseText);
        }

    });
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Festival</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
      <servlet-name>Jersey REST Service</servlet-name>
      <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

      <init-param>
          <param-name>com.sun.jersey.config.property.packages</param-name>
          <param-value>br.com.festivalRest</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>Jersey REST Service</servlet-name>
      <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>
package br.com.festivalRest.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import br.com.festivalRest.rest.jdbcinterface.FestivalDAO;
import br.com.festivalRest.objetos.User;

public class JDBCAuthenticationDAO implements FestivalDAO {
    private Connection conexao;

    public JDBCAuthenticationDAO(Connection conexao){
        this.conexao = conexao;
    }

    public boolean foundUser(User user){

        boolean checkUser = false;

        String comando = "select * from usuarios where login = ? and senha = ?";
        PreparedStatement p;

        ResultSet rs = null;

        try{
            p = this.conexao.prepareStatement(comando);
            p.setString(1, user.getLogin());
            p.setString(1, user.getSenha());
            rs = p.executeQuery();

            if(rs.next()){

                checkUser = true;

            }
        } catch(Exception e){
            e.printStackTrace();
        }

        return checkUser;
    }

}