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

标签 java json spring jhipster

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

它有几个类:CakeOrderCakeOrderItemsUserCakeCakeItem地址CakeOrder 有一个 User、一个 Address 和许多 CakeOrderItems

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

我将以下 Json 对象作为订单发布到该 Controller 。

这是订单对象:

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

嗯,问题来了。在 Controller 中,cakeOrder 只得到一个 CakeOrderItem,而在 json 对象中有三个。

这是错误还是配置错误之类的?我怎样才能让它发挥作用?

最佳答案

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

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

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

关于java - Spring MVC 不解析 json 数组正确丢失部分数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34886447/

相关文章:

java - 如何显示具有单个通知 ID 的 android GCM 通知?

java - 无法在 Java 中对我的图像使用鱼眼镜头效果

spring - 秒 :authorize returning true for both isAuthenticated() and isAnonymous() in thymeleaf view

java - Spring+JPA+Hibernate : persist is updating the entity surprisingly. 请看详细

java - Eclipse Java 构建目录

java - 有没有一种简单的方法可以将我所有的字符串转换为对 strings.xml 的引用

json - 呈现为JSON时Grails中缺少方法异常

json - 什么 repo 包含 json-taglib 神器?

javascript - 获取 AngularJs 中 window.alert 中 Angular JS 表达式的值

java - Spring框架和TestNG : unable to pass some parameters