2016-07-02 9 views
2

Ich versuche, eine einfache REST JSON API mit Tomcat 7 und Jersey 2 zu erstellen. Die GETs funktionieren alle großartig. Aber die POSTs/PUTs geben die gefürchtete 405 zurück.Jersey REST-Ressource, die HTTP-Status 405 zurückgibt - Methode nicht zulässig

Ich weiß, das ist eine beliebte Frage. Aber ich habe alle anderen Antworten recherchiert und sie helfen mir nicht.

Ich führe es auf meiner lokalen Linux-Workstation. Ich verwende echtes Oracle JDK, Eclipse Mars, Tomcat 7 und Maven, um die Abhängigkeiten zu handhaben.

Als Teil der gleichen App habe ich auch eine konventionelle JSP/Servlet-Schnittstelle, die CRUD-Operationen gut funktioniert. Also arbeitet POST für die Servlets.

Wenn ein POST/PUT fehlschlägt, wird kein Eintrag im Tomcat-Protokoll aufgezeichnet. Ich verwende die POSTMAN App in Chrome, um die Anfragen zu generieren.

Ich habe alle Arten von Permutationen der Dinge versucht, aber keinen Einfluss. Ich denke, wenn man sich den Code anschaut, wird sich keine einfache Antwort ergeben. Aber es ist unten.

Kann jemand bitte eine Methode zum Debuggen vorschlagen? Wenn es auf dem Server nicht fehlschlägt. Wohin geht es?

Vielen Dank im Voraus

Ich bin mit Servlets 3, so dass keine Notwendigkeit, sie in der web.xml aus dem DAO zurück

Allem definieren arbeitet so werde ich diesen Code überspringen ..

.

RestApplication.java

package resources; 

import javax.ws.rs.ApplicationPath; 

import org.glassfish.jersey.server.ResourceConfig; 

@ApplicationPath("rest") 
public class RestApplication extends ResourceConfig { 
    public RestApplication() { 
     packages("resources"); 
    } 
} 

PersonResource.java

package resources; 

import java.util.List; 

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

import org.apache.commons.lang3.StringUtils; 

import com.mongodb.MongoClient; 
import com.mongodb.MongoClientURI; 

import dao.PersonDAO; 
import model.Person; 

@Path("/persons") 
public class PersonResource { 

    private MongoClientURI cs; 
    private MongoClient mc; 
    private PersonDAO personDAO; 

    public PersonResource() { 
     super(); 

     cs = new MongoClientURI("mongodb://localhost:27017"); 
     mc = new MongoClient(cs); 
     personDAO = new PersonDAO(mc); 
    } 

    @Path("/") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Person> getPersonsAll() { 

     List<Person> persons = personDAO.getAllPerson(); 
     return persons; 
    } 

    @Path("/add") 
    @POST 
    @Consumes(MediaType.APPLICATION_JSON) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response addPerson(Person person) { 

     personDAO.createPerson(person); 
     return Response.status(201).build(); 
    } 

    @Path("/get/{id}") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Person getPersonById(@PathParam("id") String id) { 

     Person person = new Person(); 
     if (StringUtils.isNotEmpty(id)) { 
      person.setId(id); 
      person = personDAO.getPerson(person); 
     } 
     return person; 
    } 

} 

Antwort

1

Aus irgendeinem Grund der Fehler plötzlich 405 wurde Fehler 415 - Nicht unterstützter Medientyp. Dann, weil POSTMAN die Header nicht richtig gesetzt hat.

Ich habe dann versucht, den anderen Chrome App Advanced REST Client ... Sobald ich einen Header für die Anwendung/Json angegeben hat alles begann zu arbeiten.

Ich vermute, das bedeutet, es war mehr ein Problem mit POSTMAN als der Code.

Manchmal muss man die Frage stellen, auf SO, um Ihre eigene Antwort zu finden ...

Danke fürs Zuhören.