[Ajax] POST JSON失敗,415 Unsupported媒體類型,Spring 3 mvc


Answers

我遇到了類似的問題,但發現問題是我忽略為使用@RequestBody註釋的DTO提供默認構造函數。

Question

我試圖發送一個POST請求到一個servlet。 以這種方式通過jQuery發送請求:

var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);

newCategory在哪裡

function newCategory(productCategory)
{
  $.postJSON("ajax/newproductcategory", productCategory, function(
      idProductCategory)
  {
    console.debug("Inserted: " + idProductCategory);
  });
}

和postJSON是

$.postJSON = function(url, data, callback) {
    return jQuery.ajax({
    'type': 'POST',
    'url': url,
    'contentType': 'application/json',
    'data': JSON.stringify(data),
    'dataType': 'json',
    'success': callback
    });
};

用螢火蟲我看到JSON發送正確:

{"idProductCategory":1,"description":"Descrizione2"}

但是我得到415不支持的媒體類型。 Spring mvc控制器有簽名

    @RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
        @RequestBody ProductCategory productCategory)

前幾天它的工作,現在不是。 如果需要,我會顯示更多的代碼。 謝謝




我遇到了類似的問題,這是我如何解決它,

問題是由於從JSON到Java的轉換過程,需要有正確的運行時間jackson庫才能正確轉換轉換。

添加下列jar(通過依賴關係或下載並添加到類路徑中)。

<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.3</version>
</dependency>

這應該解決這個問題。

完整代碼:

function() {
$.ajax({
type : "POST",
url : "saveUserDetails.do",
data : JSON.stringify({
name : "Gerry",
ity : "Sydney"
}),
headers: { 
'Accept': 'application/json',
'Content-Type': 'application/json' 
},
success : function(data) {
if (data.status == 'OK')
alert('Person has been added');
else
alert('Failed adding person: '
+ data.status + ', '
+ data.errorMessage);
}

並且控制器簽名如下所示:

@RequestMapping(value = "/saveUserDetails.do", method = RequestMethod.POST)
public @ResponseBody Person addPerson( @RequestBody final  Person person) {

希望這可以幫助




application/json解決了該問題後,將內容類型添加到請求中




最小版本的REST服務:

  • 與Wildfly一起測試
  • 傑克遜maven依賴不需要

pom.xml中:

...
<properties>
     <springframework.version>4.3.1.RELEASE</springframework.version>
</properties>
...
<packaging>war</packaging>
...
<dependencies>
  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${springframework.version}</version>
  </dependency>

  <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</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-context</artifactId>
  <version>${springframework.version}</version>
</dependency>

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

  <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
      <scope>provided</scope>
  </dependency>

</dependencies>

<build>
    <sourceDirectory>src/main/java</sourceDirectory>

    <finalName>spring-rest-demo</finalName>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>dependency-jars/</classpathPrefix>
                    </manifest>
                </archive>
                <webXml>${project.basedir}\src\main\webapp\WEB-INF\web.xml</webXml>
            </configuration>
        </plugin>
    </plugins>
</build>

...

的src / main / JAVA / web應用/ WEB-INF / web.xml文件:

...
<display-name>Spring MVC Application</display-name>

<servlet>
    <servlet-name>RestDemo</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>RestDemo</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
...

的src / main / JAVA / web應用/ WEB-INF / RestDemo-servlet.xml中:

...
<mvc:annotation-driven/>
<context:component-scan base-package="your.package.path" />
...

REST控制器:

沒有任何數據檢查,僅用於教育目的

@RestController
public class SpringRestServiceImpl implements SpringRestService {

    @Autowired
    private VideoGameDao videoGameDao;

    ...

    @RequestMapping(value = "/rest/save", method = RequestMethod.POST, consumes = {"application/json"})
    @Override
    public ResponseEntity save(@RequestBody VideoGame videoGame) {
        return ResponseEntity.ok(videoGameDao.save(videoGame));
    }

    ...
}

如何檢查:

捲曲:

curl -i -POST -H "Content-Type: application/json" -d "your-json-here" http://yourserver:8080/spring-rest-demo/rest/save

Postman工具







我管理出如何使它工作。 告訴我,如果我錯了。 我只用一種方法來序列化/反序列化:我刪除了關於這個( @JSONSerialize@JSONDeserialize )的所有註釋,並在CustomObjectMapper類中註冊了Serializers和Deserializers。 我沒有找到解釋這種行為的文章,但我以這種方式解決了。 希望它是有用的。