2015-10-31 14 views
12

Sto lavorando su un servizio Web Java restful. Ho funzionato per la richiesta GET, ma la richiesta POST non funziona. La mia classe Controller è RestController. Finora li ho eseguiti:Stato HTTP 415 - l'entità richiesta è in un formato non supportato

@RequestMapping(value = "/api/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 
public long signUp(@ModelAttribute ApiMemberModel apiMember) { 
    memberService = new MemberDetailsService(); 
    Member m = memberService.createMember(apiMember.getUsername(), apiMember.getPassword(), apiMember.getEmail(), ""); 
    return m.getId(); 
} 

Inoltre, ha provato RequestBody anziché ModelAttribute.

Io uso Postman extension per inviare la richiesta POST. Per esempio:

{ 
    "username": "asd", 
    "password": "sfsdg", 
    "email": "[email protected]" 
} 

ma ho l'errore:

description The server refused this request because the request entity is in a format not supported by the requested resource for the requested method. 

Che cosa sto facendo di sbagliato? classe del modello è:

public class ApiMemberModel { 
    private String username; 
    private String password; 
    private String email; 

    public ApiMemberModel(String username, String password, String email) { 
     this.username = username; 
     this.password = password; 
     this.email = email; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
} 
+1

Mostraci il codice della tua classe modello – Marged

+2

@Marged aggiunto ora. – nope

+2

_ "Ho provato anche RequestBody invece di ModelAttribute." _, Giusto, ma hai bisogno anche di un costruttore no-arg sul modello, altrimenti Jackson non può crearlo. Oppure usa '@ JsonCreator' –

risposta

27

Scommetto che chiamata da postino non include Content-Type: application/json.

HTTP 415 significa che il server non comprende il formato multimediale della richiesta. Nel controller si sta specificando che accetta JSON, ma non è stato detto se la richiesta indica che il corpo è in quel formato. Solo perché hai inserito i dati nel formato JSON, non significa che il server lo riconoscerà, devi indicarlo nell'intestazione Content-Type.

+1

Grazie! Specificare il tipo di contenuto e aggiungere un costruttore no-arg ha aiutato a risolvere il mio problema. – nope

+0

Hai ragione. Mi stavo chiedendo anche dopo aver usato jsonlint.com perché il mio JSON non era valido. – Dr4gon

+2

Ciao! per favore ho lo stesso problema anche se specifichi Content-Type sul lato client. Mi potete aiutare per favore? –

2

Spring fornisce molti HttpMessageConverters predefiniti, che verranno utilizzati per la conversione, in base alla presenza di determinate librerie nel percorso di classe del progetto.

Ad esempio, se Content-Type nell'header di richiesta era una delle applicazioni/json o application/xml, ciò significa che il corpo POST contiene json o XML [formati popolari] e se la libreria Jackson si trova nel classpath, Spring delegherà la conversione a MappingJackson2HttpMessageConverter [per json] o MappingJackson2XmlHttpMessageConverter [per xml].

Per dichiarare una dipendenza di Jackson libreria (jackson-DataBind) comprendono seguente dipendenza nel tuo pom.xml

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>${jackson.version}</version> 
</dependency> 
0

Anch'io ho avuto lo stesso problema. Aggiungi l'intestazione ContentType a application/xml (o qualunque cosa si aspetti dal servizio) al postino.

0

Sono un po 'vergogna a scrivere questo, ma ho dimenticato di mettere l'attributo enctype="multipart/form-data" nel tag form:

<form action="rest/upload_function_path" method="post" enctype="multipart/form-data"> 
<!-- this thing right --------------------------------^ there! --> 
    <p> 
    Your file is: <input type="file" name="fajl" /> 
    </p> 
    <input type="submit" value="Upload It" /> 
</form> 

Questo è un errore piuttosto scadente, ma anche quella che ha avuto un po' di tempo per rendersi conto.