简体   繁体   中英

AngularJS and Spring MVC - $http 400 Bad Request

I'm trying to post a object that includes an id (int) and a array, but I get a http 400 Bad request response from the server side. This is what I have so far...

Java Bean Object for Request:

public class GuardarVentaRequest {

private Integer idCliente;
private List<Venta> venta; ... (Getters and Setters code)

Java Object:

public class Venta {

private Integer id;
private String nombre;
private Integer precio;
private Integer cantidad;
private Integer total; ... (Getters and Setters code)

Java Controller:

@RequestMapping(value = "/guardarVenta", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody void venta(@RequestBody GuardarVentaRequest factura){
    System.out.println(factura);
}

AngularJS Service:

function guardarVenta(array){                                       
    let factura = {
        idCliente : parseInt($('#cliente').val()),
        venta : array,
    };
    console.log(factura);
    $http({
        method: 'POST',
        url: '/blue/guardarVenta',
        contentType: 'application/json',
        data: factura
    }).then(
    function successCallback(response){
        console.log(response.statusText);
    },
    function errorCallback(response){
        console.log(response.statusText);
    }
    );
}

Array:

$scope.productos = new Array();
let productoInfo = {
        id: $scope.producto.id,
        nombre: $scope.producto.nombre,
        precio: $scope.producto.precio,
        cantidad: $scope.cantidadProducto,
        total: $scope.producto.precio * $scope.cantidadProducto 
    }
    $scope.productos.push(productoInfo);

Output:

ADVERTENCIA: Failed to read HTTP message: 
org.springframework.http.converter.HttpMessageNotReadableException: Could 
not read document: Can not construct instance of com.blue.beans.Venta: no 
suitable constructor found, can not deserialize from Object value (missing 
default constructor or creator, or perhaps need to add/enable type 
information?)
at [Source: java.io.PushbackInputStream@663359f3; line: 1, column: 28] 
(through reference chain: com.blue.beans.GuardarVentaRequest["venta"]-
>java.util.ArrayList[0]); nested exception is 
com.fasterxml.jackson.databind.JsonMappingException: Can not construct 
instance of com.blue.beans.Venta: no suitable constructor found, can not 
deserialize from Object value (missing default constructor or creator, or 
perhaps need to add/enable type information?)
at [Source: java.io.PushbackInputStream@663359f3; line: 1, column: 28] 
(through reference chain: com.blue.beans.GuardarVentaRequest["venta"]-
>java.util.ArrayList[0])

Chrome's Network Tab Output

Any ideas?

Try these 3 things.

  1. Add the default constructor to GuardarVentaRequest and Venta.

    GuardarVentaRequest(){} & Venta(){}

  2. Check if a HTTPMessageConverter has been added to your spring config. Eg: MappingJackson2MessageConverter (Check for compatibility with your spring version).

  3. Try serializing the request payload by using angular.toJson

Hope that helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM