Spring Request method 'POST' not supported

Dieses Thema Spring - Request method 'POST' not supported im Forum "Application Tier" wurde erstellt von Semox, 24. Aug. 2012.

Thema: Request method 'POST' not supported Hallo zusammen Ich habe ein Problem beim hinzufügen eines neuen Datenbankentrags, das dadurch entsteht, daß beim...

  1. Hallo zusammen

    Ich habe ein Problem beim hinzufügen eines neuen Datenbankentrags, das dadurch entsteht, daß beim Versuch des Sendens eines JSON-Strings an den Controller scheitert, weil Tomcat an das Framework folgende Warnung zurückgibt:

    Code (Text):
    WARN : org.springframework.web.servlet.PageNotFound - Request method 'POST' not supported
    Das Absenden habe ich mittels Chrome über das REST-Console Plugin durchgeführt. Folgendes habe ich beim POST mitgegeben:

    Request URI: http://localhost:8080/BrainTrainer/person/add/
    Content-Type: application/json
    Payload:
    Code (Text):
    {
        "gender": "Male",
        "firstName": "Meinhard",
        "lastname": "Nasenbär",
        "birthDate": "3.9.1932",
        "totalScore": 0,
        "reactionTime": 0,
        "visits": 0
    }
    (ID wird ja automatisch vergeben. Muß ich nicht mitsenden, oder?)

    Sendeart: POST

    Das ist die Methode, die sich um das adden einer neuen Person kümmert:

    Code (Java):


    ...
    @Controller
    @RequestMapping("/person/")
    public class PersonController {

    @RequestMapping(method = RequestMethod.POST, headers = "Content-Type = application/json", value = "/person/add/")
        @ResponseBody
        public Person addPerson(@RequestBody Person person){
            logger.info("Person angelegt: " + person.toString());
            personDao.addPerson(person);
            return person;
        }
    ...
    }
     
    Durchführung der Persistenz:

    Code (Java):


    ...
    @Repository
    @Transactional
    public class PersonDao {
       
            @Transactional
        public void addPerson(Person person) {
            entityManager.merge(person);
        }
    ...
    }
     
    Das sind die Teile, die sich im das Speichern kümmern sollen. Nur kommt es niemals dazu. Muß man da irgendwas am Tomcat Plugin manipulieren (per Maven eingebunden), oder ist das ein Problem der Konfigurations-XMLs im /webapp/ Ordner? Hab was gelesen von nem Servlet Mapping, daß man da was drehen muß, aber mir geht nicht auf, was genau zu tun ist...

    Wer sich den Code ansehen will, kann sich das gesamte Projekt auf GitHub anschauen, da es öffentlich ist. Hier ist der Link zum Repo:

    https://github.com/Semo/BrainTrainer

    Danke für Eure Unterstützung.

    Viele Grüße,
    Semox
     
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. Hab jetzt gerade keine Zeit das nachzuvollziehen, aber müsste deine Anfrage für die hier angegebene Methode nicht

    ...Braintrainer/person/person/add

    heißen?

    Du hast ein Class-Level RequestMapping und relativ dazu dann dein Method-Level RequestMapping...
     
  4. Hallo DerFeivel

    Danke. Leider ist das auch nicht das Problem gewesen. Ich habe mal das relative Mapping der Methode entfernt, weil es lt. Deines Hinweises dann wirklich so sein müßte wie beschrieben, was quatsch ist.

    Trotzdem, nachdem ich auch mal verschiedene Pfade probiert hatte, kam immer nur eine 405 zurück.

    Interessanterweise gibt es einen anderen Fehler, wenn ich als Annot. ausschließlich nur
    Code (Text):
    @RequestMapping(method = RequestMethod.PUT)
    anstatt von:
    Code (Text):
    @RequestMapping(method = RequestMethod.PUT, headers = "application/json")
    benutze.

    Im ersten Code Snippet bekomme ich dann ne 415 zurück, die dann weg war, als ich als Content-Type noch application/json mitgegeben habe. Dann gab's nur noch ne 500 mit org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of de.bht.mme2.domain.Person out of START_ARRAY token.

    Ich weiß echt nicht, wie ich das Problem richtig zu lösen habe. Versucht habe ich auch Varianten im JSON, der mitgeschickt wurde. Mir fehlen da Ansätze, wegen mangelnder Erfahrung.

    Viele Grüße,
    Semox
     
  5. UPDATE:

    Hallo zusammen

    Ich bin ein paar Schritte nach endlosem rekursiv-beliebiger Reihenfolge Try/Error/RTFM weitergekommen. Also es gibt zwei Fehlerquellen.

    1. Ich: Fehlerhafte Rest-Pluginnutzung in Chrome
    2. Die Annotation im RequestMapping.

    Wenn ich in dieser RequestMapping das "headers=..." weglasse funktioniert das PUT. Was mir eindeutig eine SQL Abfrage bestätigt und Hibernate über die Eclipse-Konsole zurückgibt.

    Wenn ich das "headers = blabla" wieder reinnehme, bekomme ich ne 405. Das verstehe ich nicht.

    Code (Text):
    WARN : org.springframework.web.servlet.PageNotFound - Request method 'PUT' not supported
     
    Wie löst man denn nun das Problem korrekt, daß ich ganz normal einen PUT-Request an den Server absetzen kann?

    Viele Grüße,
    Semox
     
  6. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!