HTTP 400 Feher bei REST Web Service durch POST per FormParam

Für einen Bestellprozess muss ich in meinem REST Web Service vom Client an den Server eine Liste von Objekten senden bzw. ein eigenes DTO.

Ich habe schon herausgefunden, dass String- oder Integer-Listen per
Code:
@FormParam
gesendet werden können. Das funktioniert auch.

Sende ich jedoch eine Liste von eigenen Entitäten (oder eine einzelne Entität) oder will ich mein eigenes (auf beiden Seiten definiertes) DTO senden, so bekomme ich immer den Fehler
Code:
400 - Bad Request
.

Woran kann das liegen? Können nur Standard-Typen gesendet werden?

PS: Ich nutze einen SAP Netweaver AS, aber bislang verhielt er sich wie jeder andere auch. Daher glaube ich erst einmal nicht, dass es am Server (oder dessen Version) liegt.

Vielen Dank für eure Hilfe.


Mein Code auf Server-Seite:

Java:
    @Path("/test")
    @POST
    @Produces(MediaType.TEXT_XML)
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)    
    public String test(
        @FormParam("kunde") Kunde kunde) {    
       
        return "Der Name des Kunden ist: "+kunde.getVorname()+" "+kunde.getNachname();        
    }

Mein Code auf Client-Seite: (die Methode befindet sich in einer Session Bean)

Java:
 public String  test() {
          
        Kunde kunde = new Kunde();
        kunde.setNachname("Müller");
        kunde.setVorname("Kurt");
        
        Form form = new Form();
        form.add("kunde", kunde);       
        
        return service
            .path("test")
            .type(MediaType.APPLICATION_FORM_URLENCODED)
            .accept(MediaType.TEXT_XML)
            .post(String.class, form);
    }

Mit demselben Code (nur die Parameter des
Code:
form.add()
und die Eingabeparameter der Servermethode waren anders) habe ich bisher schon erfolgreich Strings, Integer und String-Listen zum Server gesandt und irgendwas davon zurückgegeben. Nur mit eigenen Typen/Klassen/Entitäten klappt es nicht.

PS: durch loggen habe ich herausbekommen, dass die Server-Methode gar nicht erst aufgrufen wird, der Service bricht vorher schon ab.
 
Zuletzt bearbeitet:
**Nachtrag**:

Ich habe auch versucht, einen Proxy (via Apache JMeter) zu nutzen und mir die HTTP-Anfrage ausgeben zu lassen.
Hier stellte ich fest, dass der Parameter
Code:
kunde
den Inhalt
Code:
entities.Kunde%40af8358
hat - damit konnte der Server wohl nix anfangen. Daher nehme ich an, dass das Kunden-Objekt nicht korrekt serialisiert wurde.
(Komischerweise ist es kein Problem, vom Server ein Kundenobjekt als Response zum Client zu senden - hier wird korrekt umgewandelt.)

PS: Die Klasse
Code:
Kunde
in meinem Beispiel ist serialisierbar und annotiert mit `@XmlRootElement`.

Ich nutze die Jersey-Bibliothek Version 1.16. (<-- liegt es vielleicht an der alten Version?)
 
**Weiterer Nachtrag** - Senden einer Liste via form-Parametern

Ich muss zum Originalpost noch hinzufügen, dass das Senden einer
Code:
List<String>
als einzelner form-Parameter nicht ganz das ist, was man sich vorstellt: Die Serverseite empfängt dann eine Liste der Länge 1, in der ein String mit der Listenkodierung
Code:
[eintrag1, eintrag2,... ]
ist.
Eine Liste richtig senden geht nur, indem man mehrere Parameter desselben Namens mit unterschiedlichem Wert an die form hängt, dann kommt es drüben als Liste an.
 
Zuletzt bearbeitet:
Ich habe inzwischen herausgefunden, dass man KEINE Objekte direkt über REST senden kann. Zumindest bei Listen wird es verdammt schwer.

Ein einzelnes Objekt kann man auf Clientseite in einen JSON String umwandeln und dann senden - muss aber auf Serverseite wissen, dass ein JSON String kommt, der wieder zurückgewandelt werden muss.

Für mein Beispiel mit der Artikelbestellung habe ich daher folgenden Umweg genommen:

Ich habe die Artikelnummern als Integer-Liste und die Mengenangaben auch als Integer-Liste gesendet. Auf Serverseite habe ich mir zu den Artikelnummern aus der Datenbank den Artikel geholt und die Menge hinzugefügt. Das geht aber NUR, weil die Reihenfolge in den Listen korrekt erhalten bleibt. D.h. Menge an Stelle 1 gehört zu Artikel an Stelle 1 usw., darauf muss man dann achten.
DTOs sind jedenfalls nur sehr schwer zu senden, außer als komplizierter und großer JSON (oder auch XML, aber das macht den Sinn von REST zunichte) String.

Hier meine Methoden zum Konvertieren nach/von JSON (man braucht hierfür das jackson Package):

Objekt --> JSON:

Java:
import org.codehaus.jackson.map.ObjectMapper;
...
private String convertObjectToJsonString(Object o) {

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ObjectMapper mapper = new ObjectMapper();
            mapper.writeValue(out, o);

            return out.toString(); 
}

JSON --> Objekt

Java:
import org.codehaus.jackson.map.ObjectMapper;
...
private Object convertJsonStringToObject(String string, Class klasse) {
       
            InputStream inputStream = new ByteArrayInputStream(string.getBytes());
            ObjectMapper mapper = new ObjectMapper();
            Object o = mapper.readValue(inputStream, klasse);
            return o;
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Jersey Http 404 bei Redirect SOA 2
D POST-Request mit Chrome Rest Client wirft Fehler : HTTP Status 415 - Cannot consume content type SOA 3
P SOAP Webservice mit HTTP Basic Authentifizierung SOA 1
K Jax-RS + HTTP Request auf WebContent abfangen SOA 2
G Soap, http SOA 3
A Restful => HTTP ERROR: 500 SOA 3
sascha-sphw Statuscode REST Response DELETE SOA 2
B Authentication & Authorization REST API SOA 43
B REST - es gibt eine REST API, wie mache ich nun in JAVA weiter? SOA 8
mrBrown Rest - Bilder mit Metadaten modellieren SOA 24
OnDemand REST Client Aufbau SOA 7
Shams Was ist ein "Deployment" bei Rest? SOA 1
M Kann man das Protokoll eines REST (Jersey) bzw. SOAP Web Services manipulieren? SOA 5
P REST POST -> return SOA 4
G WebServices REST SOA 5
H [REST] Deserialisierung eines Object-Feldes SOA 6
G Rest und Sicherheit SOA 3
J Berechtigungen bei REST SOA 2
G Rest - Session Handling SOA 3
J REST mit java client und php server SOA 22
C REST Webservices, XML Ausgabe und Objektübertragung SOA 2
F REST Service mit Netbeans und MySQL Datenbank SOA 1
D Sicherheit bei REST-Webservice SOA 19
M Sicherer REST-Service SOA 2
K Vortrag über REST SOA 5
T Hat AXIS2 noch Zukunft und wie REST implementieren? SOA 6
T Rest Webservice der 2 verschiedene XML Objekte(JaxB) entgegennimmt SOA 10

Ähnliche Java Themen

Neue Themen


Oben