2013-02-28 19 views
6

Non riesco a capire perché non riesco a pubblicare aggiornamenti sul mio controller. Sto cercando di inviare dati json tramite un addon chrome. Alla fine userò angolare per le richieste. Ho controllato altri articoli StackOverflow e sembra di avere tutto ciò che suggeriscono.Spring MVC application not accepting JSON

Per quello che vale ho una richiesta GET allo stesso controller che funziona senza problemi.

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. 

mio log del server mostra il seguente

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) 

Messaggio per affrontare

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

dati da inviare mappatura

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

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

_ AGGIORNAMENTO _ _

ho iniziato ad usare amplificare fare le mie richieste perché volevo essere sicuro che non era il cromo Aggiungi su. Sto ottenendo un 400 ora. Di seguito è riportato l'errore sul mio 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: [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 

Ecco la definizione e richiesta di amplificazione.

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

dati:

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

può verificare se il client invia la corretta intestazione Content-Type, application/json – gouki

+2

Spring MVC dipende Jackson (sia 1 o 2) per gestire l'input o l'output JSON. Hai qualche biblioteca di Jackson nel tuo classpath? –

+0

Pubblica il tuo codice lato client che invia i dati, il problema sembra essere sul lato client – Kris

risposta

5

avevo bisogno di aggiungere quanto segue il fagiolo jsonConverter.

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

Bean finale è stato il seguente

<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