Spring MVC应用程序不接受JSON

问题描述:

我不明白为什么我不能将更新发布到我的控制器。我正在尝试通过Chrome插件提交json数据。最终,我将对请求使用角度。我检查了其他的*文章,似乎我有他们建议的一切。Spring MVC应用程序不接受JSON

为什么它的价值我有一个GET请求到工作没有问题的同一个控制器。

HTTP Status 415 - The server refused this request because the request entity is in a format not supported by the requested resource for the requested method. 

我的服务器日志显示以下

INFO - Mapped "{[/service/products/addProduct],methods=[POST],params=[],headers=[],consumes=[application/json],produces=[],custom=[]}" onto public void com.cr.controllers.ProductsController.addProduct(com.cr.entity.Products) 

邮政解决

http://localhost:8082/service/products/addProduct 

数据被张贴

{ 
    "productId": 2, 
    "productModel": "Product Model 2", 
    "productName": "Product Name 2", 
    "dateAdded": 1361880001000, 
    "productWeight": 2, 
    "productStatus": "Hidden", 
    "productTaxClass": { 
     "taxId": 2, 
     "taxClassTitle": "High Tax Class", 
     "taxClassDescription": "This is a high tax class", 
     "lastModified": 1361880001000, 
     "dateAdded": 1361880001000 
    }, 
    "productImages": { 
     "imageId": 2, 
     "imageDescription": "Product Image 2", 
     "imageTitle": "Image 2", 
     "imagePath": "prd_02.jpg", 
     "imageRelation": 1 
    }, 
    "productManufacturer": { 
     "manufacturerId": 2, 
     "manufacturerName": "Factory 2", 
     "manufacturerImage": null 
    }, 
    "quantityAvailable": 4, 
    "quantityInWarehouse": 4, 
    "stockAlert": 1, 
    "productCost": 1, 
    "productRetail": 1, 
    "productPrice": 1, 
    "productSalePrice": 1, 
    "saleInd": null, 
    "productSku": null, 
    "backOrderMessage": null, 
    "inStockMessage": null, 
    "outOfStockMessage": null, 
    "manufacturerproductsku": null, 
    "productDescriptionId": { 
     "productTextId": 2, 
     "productTextData": "Este es en espanol", 
     "lastModified": 1361793601000 
    } 
} 

控制器映射

@RequestMapping(value = "/service/products/addProduct", 
     consumes = "application/json", 
     method= RequestMethod.POST) 
public @ResponseBody void addProduct(@RequestBody Products products){ 
    productsDao.createProduct(products); 
} 

的web.xml

<servlet-mapping> 
     <servlet-name>cr</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>httpMethodFilter</filter-name> 
     <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>httpMethodFilter</filter-name> 
     <servlet-name>cr</servlet-name> 
    </filter-mapping> 

_ UPDATE _ _

我开始使用放大做我的请求,因为我想确保它不是镀铬加上。我现在得到了400。以下是我的服务器上显示的错误。

org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.cr.entity.Products out of START_ARRAY token 
at [Source: [email protected]; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.cr.entity.Products out of START_ARRAY token 
at [Source: [email protected]; line: 1, column: 1 

这里是放大定义和请求。

amplify.request.define("addRequest", "ajax", { 
      url: "service/products/addProduct", 
      type: "POST", 
      dataType: 'json', 
      contentType: 'application/json' 
     }); 
     amplify.request({ 
      resourceId: "addRequest", 
      data: JSON.stringify(jsonData), 
      success: function() { 
       alert("success") 
      }, 
      error: function() { 
       alert("fail") 
      } 
     }); 

数据:

var jsonData = [{ 
    "productId": 4, 
    "productModel": "Product Model 2", 
    "productName": "Product Name 2", 
    "dateAdded": 1361880001000, 
    "productWeight": 2, 
    "productStatus": "Hidden", 
    "productTaxClass": { 
     "taxId": 2, 
     "taxClassTitle": "High Tax Class", 
     "taxClassDescription": "This is a high tax class", 
     "lastModified": 1361880001000, 
     "dateAdded": 1361880001000 
    } 
}]; 
+2

您可以检查您的客户端发送正确的Content-Type头,应用/ JSON – gouki 2013-03-01 02:41:43

+2

Spring MVC的依赖于杰克逊(或者1或者2)为了处理JSON输入或输出。你的classpath中有没有jackson库? – 2013-03-01 06:56:10

+0

发布您提交数据的客户端代码,问题似乎在客户端 – Kris 2013-03-01 10:34:08

我需要添加以下到jsonConverter豆。

<property name="prefixJson" value="false"/> 

最后一个bean是如下

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
     <property name="prefixJson" value="false"/> 
     <property name="supportedMediaTypes" value="application/json"/> 
    </bean> 

Another Stack Overflow Article