2016-07-14 52 views
1

尝试使用Spring MVC接收发布请求时,出现错误(处理程序执行导致异常:内容类型'application/json'不受支持) 。Spring MVC和jackson不支持内容类型'application/json'

我的JSON,只是为了测试,是非常简单的:

{ "test": "abc123" } 

我的POJO类:

public class Request { 

    String test; 

    public String getTest() { 
     return test; 
    } 

    public void setTest(String test) { 
     this.test = test; 
    } 

} 

而且我的控制器:

@RequestMapping(value = "/testing", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
private void testing(@RequestBody Request body, @RequestHeader HttpHeaders headers, HttpServletRequest httpRequest) { 
    System.out.println(body.getTest()); 
} 

在我的pom.xml,我补充说:

<dependencies> 
    ... 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.7.2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.codehaus.jackson</groupId> 
     <artifactId>jackson-mapper-asl</artifactId> 
     <version>1.8.5</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.dataformat</groupId> 
     <artifactId>jackson-dataformat-xml</artifactId> 
     <version>2.4.3</version> 
    </dependency> 
</dependencies> 

我认为json反序列化中有些问题,但我找不到它。

任何帮助,欢迎。谢谢。

+0

为什么在'produce'上使用'MediaType.APPLICATION_JSON_VALUE',而在'consumes'上使用字符串?当方法不产生任何东西时,为什么你有'produce'和'@ ResponseBody'?这可能会让Spring MVC混淆,以防止映射工作。 – Andreas

+0

@Andreas,'MediaType.APPLICATION_JSON_VALUE'只是''application/json''的一个常量,所以我不认为这是问题所在。 无论如何,我删除了'produce'和'@ ResponseBody',我仍然处于同一个问题。 –

+0

@PedroH你为什么需要这个“消费”属性呢?它仅用于使映射更具体。删除它,然后重试。 – Nikem

回答

2

这是我的工作例如:

@SpringBootApplication 
@Controller 
public class Application { 

    public static void main(String[] args) { 
    SpringApplication.run(Application.class); 
    } 


    @RequestMapping(value = "/testing", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
    @ResponseBody 
    private void testing(@RequestBody Request body, @RequestHeader HttpHeaders headers, HttpServletRequest httpRequest) { 
    System.out.println(body.getTest()); 
    } 
} 

这个项目只有1依赖性:

org.springframework.boot:spring-boot-starter-web 

当我调用的URL是这样的:

curl -XPOST -v -d '{ "test": "abc123" }' -H "Content-type: application/json" http://localhost:8080/testing 

我在日志中看到正确的abc123。如果我删除Content-type头我得到的异常

org.springframework.web.HttpMediaTypeNotSupportedException","message":"Content type 'application/x-www-form-urlencoded' not supported 
1

添加此在webconfig类

@Bean 
public ContentNegotiatingViewResolver contentViewResolver() { 
    ContentNegotiationManagerFactoryBean contentNegotiationManager = new ContentNegotiationManagerFactoryBean(); 
    contentNegotiationManager.addMediaType("json", MediaType.APPLICATION_JSON); 

    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); 
    viewResolver.setPrefix("/WEB-INF/jsp/"); 
    viewResolver.setSuffix(".jsp"); 

    MappingJackson2JsonView defaultView = new MappingJackson2JsonView(); 
    defaultView.setExtractValueFromSingleKeyModel(true); 

    ContentNegotiatingViewResolver contentViewResolver = new ContentNegotiatingViewResolver(); 
    contentViewResolver.setContentNegotiationManager(contentNegotiationManager.getObject()); 
    contentViewResolver.setViewResolvers(Arrays.<ViewResolver> asList(viewResolver)); 
    contentViewResolver.setDefaultViews(Arrays.<View> asList(defaultView)); 
    return contentViewResolver; 
} 

UPDATE

从批评的人是正确的,这不会解决你的问题,但我发现了一些。

如果我设置了consumes = MediaType.APPLICATION_JSON_VALUE,并且在请求中我没有指定内容类型,它将抛出异常,那么如果我设置了内容类型,则问题是固定的。

现在,问题似乎与您的依赖关系有关。

我的POM依赖关系:

<properties> 
    <springframework.version>4.1.9.RELEASE</springframework.version> 
    <springframework.security.oauth.version>2.0.9.RELEASE</springframework.security.oauth.version> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 

    ... 

</properties> 

<dependencies> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context-support</artifactId> 
     <version>${springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.security.oauth</groupId> 
     <artifactId>spring-security-oauth2</artifactId> 
     <version>${springframework.security.oauth.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.3.1</version> 
    </dependency> 

    ... 

</dependencies> 
+0

我不认为我需要这个。我甚至没有使用jsp文件。 –

+0

他们为什么需要这个?这个bean的贡献是什么? –

+0

还没有工作。 我有你所有的依赖关系,我在我的请求头上放置了Content-Type“application/json”。 –

0

在我的情况下,问题是一个除了将具有一种类型,是为杰克逊容易出错,这是类型的JSONObject的属性的DTO。杰克逊因为这个增加而无法反序列化其他对象。
异常消息是完全不准确的!

相关问题