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.
Advertisement
Answer
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 []
.