2015-02-11 10 views
24

Sto tentando di utilizzare spring-boot-starter-web per creare un servizio di restituzione che serve rappresentazioni JSON di oggetti Java. Da quello che ho capito, questo jar boot-starter-web dovrebbe gestire automaticamente la conversione in JSON tramite Jackson, ma sto ricevendo questo errore."Impossibile trovare la rappresentazione accettabile" utilizzando spring-boot-starter-web

{ "timestamp": 1423693929568, 
    "status": 406, 
    "error": "Not Acceptable", 
    "exception": "org.springframework.web.HttpMediaTypeNotAcceptableException", 
    "message": "Could not find acceptable representation" 
} 

mio controller è questo ...

@RestController 
@RequestMapping(value = "/media") 
public class MediaController { 
    @RequestMapping(value = "/test", method = RequestMethod.POST) 
    public @ResponseBody UploadResult test(@RequestParam(value="data") final String data) { 
     String value = "hello, test with data [" + data + "]"; 
     return new UploadResult(value); 
    } 

    @RequestMapping(value = "/test2", method = RequestMethod.POST) 
    public int test2() { 
     return 42; 
    } 

    @RequestMapping(value = "/test3", method = RequestMethod.POST) 
    public String test3(@RequestParam(value="data") final String data) { 
     String value = "hello, test with data [" + data + "]"; 
     UploadResult upload = new UploadResult(value); 
     return upload.value; 
    } 


    public static class UploadResult { 
     private String value; 
     public UploadResult(final String value) 
     { 
      this.value = value; 
     } 
    } 
} 

mio pom.xml ha ...

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <version>1.2.1.RELEASE</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <version>1.2.1.RELEASE</version> 
     <scope>provided</scope> 
    </dependency> 

mvn dependency:tree dimostra che la primavera-boot-starter-web effettivamente dipende dalla jackson2 .4 database e quindi dovrebbe essere sul classpath ...

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.2.1.RELEASE:compile 
[INFO] | +- org.springframework.boot:spring-boot-starter:jar:1.2.1.RELEASE:compile 
[INFO] | | +- org.springframework.boot:spring-boot:jar:1.2.1.RELEASE:compile 
[INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.2.1.RELEASE:compile 
[INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:1.2.1.RELEASE:compile 
[INFO] | | | +- org.slf4j:jul-to-slf4j:jar:1.7.8:compile 
[INFO] | | | \- org.slf4j:log4j-over-slf4j:jar:1.7.8:compile 
[INFO] | | \- org.yaml:snakeyaml:jar:1.14:runtime 
[INFO] | +- com.fasterxml.jackson.core:jackson-databind:jar:2.4.4:compile 
[INFO] | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.4.0:compile 
[INFO] | | \- com.fasterxml.jackson.core:jackson-core:jar:2.4.4:compile 
[INFO] | +- org.hibernate:hibernate-validator:jar:5.1.3.Final:compile 
[INFO] | | +- javax.validation:validation-api:jar:1.1.0.Final:compile 
[INFO] | | +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile 
[INFO] | | \- com.fasterxml:classmate:jar:1.0.0:compile 
[INFO] | +- org.springframework:spring-web:jar:4.1.4.RELEASE:compile 
[INFO] | | +- org.springframework:spring-aop:jar:4.1.4.RELEASE:compile 
[INFO] | | | \- aopalliance:aopalliance:jar:1.0:compile 
[INFO] | | +- org.springframework:spring-beans:jar:4.1.4.RELEASE:compile 
[INFO] | | \- org.springframework:spring-context:jar:4.1.4.RELEASE:compile 
[INFO] | \- org.springframework:spring-webmvc:jar:4.1.4.RELEASE:compile 
[INFO] |  \- org.springframework:spring-expression:jar:4.1.4.RELEASE:compile 

... tuttavia chiamare il servizio test restituisce l'errore menzionato sopra. test2 e test3 funzionano bene provando che deve essere solo la conversione tentata a JSON che sta fallendo? Mi mancano alcuni problemi di configurazione o annotazioni? Da tutti gli esempi che riesco a trovare, annotare la classe per la conversione di base di Jackson JSON non è più necessaria.

Qualsiasi aiuto molto apprezzato.

risposta

47

Non ci sono getter pubbliche per la vostra UpdateResult, ad esempio:

public static class UploadResult { 
    private String value; 
    public UploadResult(final String value) 
    { 
     this.value = value; 
    } 

    public String getValue() { 
     return this.value; 
    } 
} 

I Believe di rilevamento automatico di default è ON e cercherà di scoprire i vostri getter. Puoi disabilitarlo con @JsonAutoDetect(getterVisibility=Visibility.NONE), e nel tuo esempio comporterà [].

+7

ben primavera è molto "utile" con il messaggio di errore HttpMediaTypeNotAcceptableException ... –

+1

ho encoutered lo stesso problema, avendo una classe vuota (finora), senza campi o getter. Sono d'accordo che il messaggio di errore è molto "utile", quindi grazie mille. – Vlasec

4

Incase aiuta qualcun altro:

stavo ottenendo un errore simile utilizzando spring/jhipsterrestful servizio. Stavo chiamando via Postman.

ho avuto un qualcosa di endpoint come:

@RequestMapping(value = "/index-entries/{id}", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
@Timed 
public ResponseEntity<IndexEntry> getIndexEntry(@PathVariable Long id) { 

Il mio problema, stava cercando di chiamare la restful endpoint tramite Postman con l'intestazione Accept: text/plain ma avevo bisogno di usare Accept: application/json

+1

Sì, penso che "Impossibile trovare una rappresentazione accettabile" mostrerà la sua brutta testa in una miriade di modi. :( – crowmagnumb

+0

Ho avuto un API JSON, ma in un percorso stavo tornando 'lo produce = MediaType.TEXT_HTML_VALUE' (raw HTML ..). Ma quando un'eccezione è stato gettato (volevo un modello di errore JSON), Primavera, probabilmente non l'ha fatto so come convertirlo in stringa ...:/Quando ho rimosso la parte 'produce' ha funzionato ..: D –

-3

Aggiungere Sotto dipendenza:

<dependency> 
    <groupId>com.fasterxml.jackson.dataformat</groupId> 
    <artifactId>jackson-dataformat-xml</artifactId> 
    <version>2.4.6</version> 
</dependency> 
+0

mostro sopra la corretta dipendenza jackson (non questa) è già lì. Quindi questa non è una soluzione per il problema: la soluzione era già stata fornita da @ikumen – crowmagnumb

0

Il mio oggetto di reso non ha funzionato avere annotazione @XmlRootElement sulla classe. L'aggiunta dell'annotazione ha risolto il mio problema.

@XmlRootElement(name = "ReturnObjectClass") 
public class ReturnObjectClass { 

    @XmlElement(name = "Status", required = true) 
    protected StatusType status; 
    //... 
} 
0

ho dovuto chiamare esplicitamente la dipendenza per la mia libreria JSON nel mio POM.

Una volta aggiunta la dipendenza sottostante, tutto ha funzionato.

<dependency> 
    <groupId>com.google.code.gson</groupId> 
    <artifactId>gson</artifactId> 
</dependency> 
0

Se si utilizza @FeignClient, aggiungere ad es.

produces = "application/json" 

al @RequestMapping annotazioni

Problemi correlati