Spring MVC 应用程序不接受 JSON

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15145460/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 05:46:27  来源:igfitidea点击:

Spring MVC application not accepting JSON

springpostspring-mvc

提问by zmanc

I cannot figure out why I cannot post updates to my controller. I am trying to submit json data via a chrome addon. Eventually I will be using angular for the requests. I checked against other stackoverflow articles and it seems I have everything that they suggest.

我不知道为什么我不能向我的控制器发布更新。我正在尝试通过 chrome 插件提交 json 数据。最终我将使用 angular 来处理请求。我检查了其他 stackoverflow 文章,似乎我有他们建议的一切。

For what its worth I have a GET request to the same controller that is working without issue.

对于它的价值,我有一个对同一个控制器的 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.  

My server log shows the following

我的服务器日志显示以下内容

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)

Post to address

邮寄地址

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

Data being posted

正在发布的数据

{
    "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
    }
}

Controller mapping

控制器映射

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

web.xml

网页.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 __

_ 更新__

I started using amplify to do my requests because I wanted to be sure that it was not the chrome addon. I am getting a 400 now. Below is the error showing on my server.

我开始使用 amplify 来处理我的请求,因为我想确定它不是 chrome 插件。我现在要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: org.apache.catalina.connector.CoyoteInputStream@28d528d5; line: 1, column: 1]; nested exception is org.codehaus.Hymanson.map.JsonMappingException: Can not deserialize instance of com.cr.entity.Products out of START_ARRAY token
 at [Source: org.apache.catalina.connector.CoyoteInputStream@28d528d5; line: 1, column: 1

Here is the amplify definition and request.

这是放大定义和请求。

 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")
            }
        });

Data:

数据:

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

采纳答案by zmanc

I needed to add the following to the jsonConverter bean.

我需要将以下内容添加到 jsonConverter bean。

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

Final Bean was as follows

最终 Bean 如下

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

Another Stack Overflow Article

另一篇 Stack Overflow 文章