Spring MVC 不解析 json 数组正确丢失部分数组
Spring MVC does not parse json with array properly losing partial array
我正在使用jhipster写一个在线蛋糕店。
它有几个class:CakeOrder
、CakeOrderItems
、User
、Cake
、CakeItem
、Address
. 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 的更多详细信息。
我正在使用jhipster写一个在线蛋糕店。
它有几个class:CakeOrder
、CakeOrderItems
、User
、Cake
、CakeItem
、Address
. 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 的更多详细信息。