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>