使用spring-boot-starter-web“找不到可接受的表示形式”


73

我试图用来spring-boot-starter-web创建一个REST服务来提供Java对象的JSON表示。据我了解,这个boot-starter-web jar应该能够自动处理通过Jackson的JSON转换,但是我却遇到了这个错误。

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

我的控制器是这个...

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

pom.xml有...

<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 显示spring-boot-starter-web确实确实取决于jackson2.4 databind,因此应该在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

...但是调用test服务会出现上述错误。test2test3可以很好地证明必须只是尝试将JSON转换失败?我是否缺少一些配置问题或注释?从我可以找到的所有示例中,不再需要为基本Jackson JSON转换注释类。

任何帮助,不胜感激。


顺便说一句,最新的春天(不确定何时添加)做得更好。去年的某个时候,我不小心又犯了这个错误,而不是上面的神秘错误,而是一个错误,几乎完全告诉我我做错了什么(不记得文本了,但是...)。因此,对于团队在改进此方面表示赞誉。
crowmagnumb

Answers:


91

您没有UpdateResult的公共获取者,例如:

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

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

我相信默认情况下,自动发现功能已启用,并且会尝试发现您的吸气剂。您可以使用禁用它@JsonAutoDetect(getterVisibility=Visibility.NONE),在您的示例中将导致[]


23
春天很好,对HttpMediaTypeNotAcceptableException错误消息很有帮助……
Michal Bernhard

2
我遇到了同样的问题,有一个空的类(到目前为止),没有任何字段或吸气剂。我同意错误消息非常“有帮助”,非常感谢。
Vlasec

2
我试图返回,List<MyClass>但是说了一下,produces = MediaType.APPLICATION_XML_VALUE所以Spring不知道如何将列表表示为XML ..:D显然……
insan-e

Wonderfule,我正在使用lombok,添加了所有arg,没有arg注释,并且完全忘记了getter setter。谢谢!
–silentsudo

17

使用spring/jhipsterRESTful服务时出现了类似的错误(通过Postman

端点类似于:

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

我试图restful通过Postman带有标头的方法调用端点,Accept: text/plain但是我需要使用Accept: application/json


1
是的,我认为“无法找到可接受的表示形式”将以多种方式显示其丑陋的头颅。:(
crowmagnumb

2
我有一个JSON API,但是我返回的一种方式produces = MediaType.TEXT_HTML_VALUE(原始HTML ..)。但是,当引发异常(我想要一个JSON错误模型)时,Spring可能不知道如何将其转换为字符串...://当我删除了produces它起作用的部分时。:D
insan-e

11

我也面临着类似的问题。在我的情况下,请求路径接受邮件ID作为路径变量,因此uri看起来像/some/api/test@test.com

并且基于路径,Spring确定uri将获取扩展名为“ .com”的文件,并尝试使用其他媒体类型进行响应,然后使用预期的媒体类型。将路径变量设置为请求参数后,它对我有用。


5

如果使用@FeignClient,请添加例如

produces = "application/json"

到@RequestMapping注释


3

将以下依赖项添加到您的pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.10.2</version>
</dependency>

我在上面显示了正确的杰克逊依赖关系(不是这个)。因此,这不是解决问题的方法。@ikumen已经提供了解决方案
crowmagnumb

1
当缺少此依赖项时,我们将得到相同的错误。因此,请不要对此答案投反对票,因为在某些情况下这是正确的。

好吧,我现在不能取消投票,因为它不会让我投票。但这仍然不是我最初问题的答案。我希望它确实对其他人有所帮助。
crowmagnumb

这不是针对上述问题的,但如果您使用produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE }并要求application/xml它是正确的解决方案
Cavva79,19年

2

我的返回对象在类上没有@XmlRootElement批注。添加注释解决了我的问题。

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

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

2

我有完全一样的问题。查看此参考资料后:http: //zetcode.com/springboot/requestparam/

我的问题通过改变来解决

method = RequestMethod.GET, produces = "application/json;charset=UTF-8"

method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE

并且不要忘记添加库:

import org.springframework.http.MediaType;

它可以在邮递员或常规浏览器上使用。


1

访问执行器时出现此问题。放置以下配置类可以解决此问题:

@Configuration
@EnableWebMvc
public class MediaConverterConfiguration implements WebMvcConfigurer {
    @Bean
    public MappingJackson2HttpMessageConverter jacksonConverter() {
        MappingJackson2HttpMessageConverter mc =
                new MappingJackson2HttpMessageConverter();
        List<MediaType> supportedMediaTypes =
                new ArrayList<>(mc.getSupportedMediaTypes());
        supportedMediaTypes
                .add(MediaType.valueOf(MediaType.APPLICATION_JSON_VALUE));
        supportedMediaTypes.add(
            MediaType.valueOf("application/vnd.spring-boot.actuator.v2+json"));
        mc.setSupportedMediaTypes(supportedMediaTypes);
        return mc;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(jacksonConverter());
    }
}

0

我必须在POM中显式调用json库的依赖项。

一旦我添加了以下依赖项,所有的工作就可以了。

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


0

我有同样的例外。问题是,我使用了注释

@RepositoryRestController

代替

@RestController


谢谢!我正在尝试执行此操作,但由于相同的原因而无法正常工作。
GuiRitter

0

当我的一个控制器拦截所有空请求时,发生了类似的问题 @GetMapping



0

就我而言,我在ResponseEntity <>()中发送了正确的对象。

正确的:

@PostMapping(value = "/get-customer-details", produces = { MediaType.APPLICATION_JSON_VALUE })
public ResponseEntity<?> getCustomerDetails(@RequestBody String requestMessage) throws JSONException {
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("customerId", "123");
    jsonObject.put("mobileNumber", "XXX-XXX-XXXX");
    return new ResponseEntity<>(jsonObject.toString(), HttpStatus.OK);
}

不正确:

return new ResponseEntity<>(jsonObject, HttpStatus.OK);

因为,jsonObject的toString()方法“将jsonObject编码为紧凑的JSON字符串”。因此,Spring直接返回json字符串,而无需任何进一步的序列化。

当我们改为发送jsonObject时,Spring会尝试基于RequestMapping中使用的Produces方法对其进行序列化,并由于“无法找到可接受的表示形式”而失败。


0

对我来说,问题在于尝试在网址中传递带点的文件名。例如

"http://localhost:8080/something/asdf.jpg" //causes error because of '.jpg'

可以通过不传递.jpg扩展名或将其全部发送到请求正文中来解决。


0

我遇到了同样的问题,而我的设置中缺少的是将其包含在我的maven(pom.xml)文件中。

<dependency>
     <groupId>org.codehaus.jackson</groupId>
     <artifactId>jackson-mapper-asl</artifactId>
     <version>1.9.9</version>
</dependency> 

-1

我有同样的例外,但是原因不同,我找不到任何相关信息,因此我将其发布在这里。忽略错误只是一个简单的方法。

坏:

@RestController(value = "/api/connection")

好:

@RestController
@RequestMapping(value = "/api/connection")

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.