Spring MVC 不解析 json 数组正确丢失部分数组

Spring MVC does not parse json with array properly losing partial array

我正在使用jhipster写一个在线蛋糕店。

它有几个class:CakeOrderCakeOrderItemsUserCakeCakeItemAddress . CakeOrder 有一个 User、一个 Address 和许多 CakeOrderItems.

class CakeOrder 看起来像这样:

@Entity
@Table(name = "cake_order")
public class CakeOrder implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name = "order_date")
    private ZonedDateTime orderDate;

    @Column(name = "ship_date")
    private ZonedDateTime shipDate;

    @Enumerated(EnumType.STRING)
    @Column(name = "status")
    private CakeOrderStatus status;

    @OneToMany(mappedBy = "cakeOrder")
    // @JsonIgnore
    private Set<CakeOrderItem> cakeOrderItems = new HashSet<>();

    @ManyToOne
    @JoinColumn(name = "address_id")
    private Address address;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
    // ...
}

一切正常,但 createCakeOrder。这是代码。

/**
 * POST  /cakeOrders -> Create a new cakeOrder.
 */
@RequestMapping(value = "/cakeOrders",
    method = RequestMethod.POST,
    produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
//
public ResponseEntity<CakeOrder> createCakeOrder(@RequestBody CakeOrder cakeOrder) throws URISyntaxException {
    if (cakeOrder.getId() != null) {
        return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert("cakeOrder", "idexists", "A new cakeOrder cannot already have an ID")).body(null);
    }
    // TODO: use transaction
    // Create CakeOrder
    CakeOrder result = cakeOrderRepository.save(cakeOrder);
    // Create CakeOrderItems belonging to that CakeOrder
    for(CakeOrderItem item : cakeOrder.getCakeOrderItems()){
        item.setCakeOrder(order);
        cakeOrderItemRepository.save(item);

    }
    return ResponseEntity.created(new URI("/api/cakeOrders/" + result.getId()))
        .headers(HeaderUtil.createEntityCreationAlert("cakeOrder", result.getId().toString()))
        .body(result);
}

我 post 以下 Json 对象作为对该控制器的命令。

这里是订单对象:

{
    "address": {
        "id": 1
    },
    "user": {
        "id": 5
    },
    "cakeOrderItems": [
        {
            "cakeItem": {
                "id": 4
            },
            "unitPrice": 268,
            "quantity": 1
        },
        {
            "cakeItem": {
                "id": 10
            },
            "unitPrice": 175,
            "quantity": 1
        },
        {
            "cakeItem": {
                "id": 18
            },
            "unitPrice": 58,
            "quantity": 1
        }
    ]
}

嗯,问题来了。在控制器中,cakeOrder 只获得一个 CakeOrderItem,而 json 对象中有三个。

是错误还是配置错误之类的?我怎样才能让它工作?

对于 CakeOrderItem class,您可能想要实现 equals 和 hashcode 方法。您正在使用 Set,因此当您插入数据时, HashSet 的实现将检查内部是否已经有任何其他相等的对象。如果是,则不会插入新数据。

检查这个关于框架背后发生的事情的答案(使用延迟加载和代理对象):What issues should be considered when overriding equals and hashCode in Java?

那里还有关于 equals 和 hashcode 的更多详细信息。