Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Could not find acceptable representation" using spring-boot-starter-web

I am trying to use spring-boot-starter-web to create a rest service serving up JSON representations of Java objects. From what I understand this boot-starter-web jar is supposed to handle the conversion to JSON through Jackson automatically but I am instead getting this error.

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

My Controller is this...

@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;         }     } } 

My pom.xml has...

<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 shows that spring-boot-starter-web does indeed depend on the jackson2.4 databind and thus should be on the 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 

... yet calling the test service gives the error mentioned above. test2 and test3 work fine proving that it must just be the attempted conversion to JSON that is failing? Am I missing some configuration problem or annotations? From all the examples I can find, annotating the class for basic Jackson JSON conversion is no longer necessary.

Any help greatly appreciated.

like image 420
crowmagnumb Avatar asked Feb 11 '15 22:02

crowmagnumb


1 Answers

You have no public getters for your UpdateResult, for example :

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

I believe by default auto discovery is on and will try to discover your getters. You can disable it with @JsonAutoDetect(getterVisibility=Visibility.NONE), and in your example will result in [].

like image 160
ikumen Avatar answered Oct 02 '22 21:10

ikumen