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

Problemas com JSON

Tenho uma aplicação e está dando alguns problemas com JSON na hora de autenticação.

415: HTTP Status [405] – [Method Not Allowed]

Type Status Report

Message Method Not Allowed

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

Apache Tomcat/9.0.0.M20

Os códigos que fazem a autenticação estão da seguinte forma:

function foundUser(){

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

    });
}
package br.com.festivalRest.rest.jdbcinterface;

import java.util.List;
import br.com.festivalRest.objetos.User;

public interface FestivalDAO {

    public boolean searchUser(User user);
}
package br.com.festivalRest.rest.authentication;

import java.io.StringWriter;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

import com.google.gson.Gson;


public class UtilRest {

    public Response buildResponse(Object result){

        Gson gson = new Gson();
        String json = gson.toJson(result);
        return Response.ok(json).build();
    }

    public Response buildErrorResponse(String str){

        ResponseBuilder rb = Response.status(Response.Status.INTERNAL_SERVER_ERROR);

        // Define o objeto que será uma mensagem retornada para o cliente
        rb = rb.entity(str);

        // Define o tipo de retorno deste objeto
        rb = rb.type("text/plain");

        return rb.build();
    }

}
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 searchUser(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(2, user.getSenha());
            rs = p.executeQuery();

            if(rs.next()){

                checkUser = true;

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

        return checkUser;
    }

}
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 com.google.gson.Gson;

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 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("/searchUser")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes("application/json")
    public Response foundUser(String usuarioParam){
        try{

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

            Gson gson = new Gson();
            User user = gson.fromJson(usuarioParam, User.class);

            jdbcAuthentication.searchUser(user);
            conec.fecharConexao();

            return this.buildResponse("OK");

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

Alguém pode me auxiliar? Se não conseguir resolver por aqui via Skype ou algo, não sei mas o que fazer para resolver.

11 respostas

Provavelmente o .serialize() do seu javascript não está montando o json que você espera. Já conferiu usando um console.log? Eu acho que o problema ta lá... Talvez você tenha que montar o json na mão em função dos dados do seu form.

Bom dia, Maria!

Este erro está relacionado à permissão dos verbos do rest. Veja este post.

https://stackoverflow.com/questions/19143971/http-status-405-method-not-allowed-error-for-rest-api

Verifique a possibilidade de adicionar o contentType na chamada do ajax.

Ola , com o contentType uma parte do erro saiu, porém agora deu esse aqui:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
    at com.google.gson.Gson.fromJson(Gson.java:887)
    at com.google.gson.Gson.fromJson(Gson.java:852)
    at com.google.gson.Gson.fromJson(Gson.java:801)
    at com.google.gson.Gson.fromJson(Gson.java:773)
    at br.com.festivalRest.rest.authentication.AuthenticationRest.foundUser(AuthenticationRest.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:205)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:475)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:498)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:796)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1368)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:385)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:213)
    ... 47 more

Maria, bom dia, você chegou a verificar a instrução do Alberto? Faz todo o sentido o que ele disse. No erro diz que você está mandando uma string e seu método espera um object.

Verifique se $("#authentication").serialize() está no formato json, conforme o Alberto falou.

Bom dia Mauricio, ele não está me retornando um JSON, e está dando problema nessa linha:

            Gson gson = new Gson();
            User user = gson.fromJson(usuarioParam, User.class);

ele me retorna uma string por isso do problema, mas não estou conseguindo resolve-lo

Maria o que contém aqui? data : $("#authentication").serialize()

Seria algo como { "user": "teste", "password": "teste" } ?

Dê um System.out.println e veja o que está chegando.

Gson gson = new Gson(); System.out.println(usuarioParam); User user = gson.fromJson(usuarioParam, User.class);

A minha resposta é

usuario=admin&senha=123

ele não esta convertendo para JSON, $("#authentication").serialize() estou dando serialize no meu form, porém está indo como String

solução!

É isto aí.

Tenta JSON.stringify($("#authentication"))

Deu certo, obrigadao!!!