2016-07-14 94 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。傑克遜因爲這個增加而無法反序列化其他對象。
異常消息是完全不準確的!

相關問題