Spring Request method 'POST' not supported

Semox

Bekanntes Mitglied
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:
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:
{
    "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:

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:

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
 

DerFeivel

Bekanntes Mitglied
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...
 

Semox

Bekanntes Mitglied
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:
@RequestMapping(method = RequestMethod.PUT)
anstatt von:
Code:
@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
 

Semox

Bekanntes Mitglied
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:
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
 

Neue Themen


Oben