Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!!!