Spring MVC application not accepting JSON

20,474

I needed to add the following to the jsonConverter bean.

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

Final Bean was as follows

 <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

Share:
20,474
zmanc
Author by

zmanc

Updated on November 17, 2020

Comments

  • zmanc
    zmanc over 3 years

    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.

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

    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

       <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.

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