使用自定义类型创建 REST API
Creating REST API with custom type
你好,我正在尝试为作业创建休息 API,他们要求我创建两个端点,第一个:
POST /client
{"money": 1000}
回复:
{"id": 1,"money": 1000,"orders": []}
第二个:
POST /client/:id/order
{"date": 17/09/2005,"type": "Pick up","dish": "tacos","total_items":
5,"item_price": 2}
回应
{"client_info": {"money": 990,"orders": [ {"dish":
"tacos","total_items": 5,"item_price": 2}
] },"order_errors": []}
为此,我创建了以下文件:
@Entity
@Data
@Table(name = "CLIENTS")
public class Client{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private ArrayList<Order> orders = new ArrayList<>();
private Float cash;
//I have getters and setters
}
和
@RestController
public class ClientController {
@Autowired
private ClientRepository restRepository;
@GetMapping("/client")
public List<Client> getAllOrders() {
return restRepository.findAll();
}
@PostMapping("/client")
public Client createAccount(@RequestBody Client client) {
return restRepository.save(client);
}
@PutMapping("/client/{id}/order")
public ResponseEntity<Client> updateOrders(@PathVariable(value = "id") Long clientId, @Validated @RequestBody Issuer orderDetails) throws ResourceNotFoundException {
Client client= restRepository
.findById(clientId)
.orElseThrow(() -> new ResourceNotFoundException("Usuario no encontrado: " + userId));
client.getOrders().add(orderDetails);
client.setMoney(client.getCash() - (orderDetails.getTotal_items() * orderDetails.getItem_price()));
final Account updatedClient = restRepository.save(client);
return ResponseEntity.ok(updatedClient );
}
}
我遇到的问题是,当我向客户添加订单时,出现以下错误:
"could not serialize; nested exception is
org.hibernate.type.SerializationException: could not serialize"
我想是因为我有一个自定义类型“订单”,但我不知道如何解决它。我正在使用 h2 内存数据库。
另外我想知道我在同一个控制器中设置第二个端点的方法是否正确
需要通过JPA注解定义Client
和Order
的关系,如:
@Entity
@Data
@Table(name = "CLIENTS")
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "client")
private List<Order> orders = new ArrayList<>();
// ...
}
@Entity
@Data
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Client client;
// ...
}
你好,我正在尝试为作业创建休息 API,他们要求我创建两个端点,第一个:
POST /client
{"money": 1000}
回复:
{"id": 1,"money": 1000,"orders": []}
第二个:
POST /client/:id/order
{"date": 17/09/2005,"type": "Pick up","dish": "tacos","total_items": 5,"item_price": 2}
回应
{"client_info": {"money": 990,"orders": [ {"dish": "tacos","total_items": 5,"item_price": 2}
] },"order_errors": []}
为此,我创建了以下文件:
@Entity
@Data
@Table(name = "CLIENTS")
public class Client{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private ArrayList<Order> orders = new ArrayList<>();
private Float cash;
//I have getters and setters
}
和
@RestController
public class ClientController {
@Autowired
private ClientRepository restRepository;
@GetMapping("/client")
public List<Client> getAllOrders() {
return restRepository.findAll();
}
@PostMapping("/client")
public Client createAccount(@RequestBody Client client) {
return restRepository.save(client);
}
@PutMapping("/client/{id}/order")
public ResponseEntity<Client> updateOrders(@PathVariable(value = "id") Long clientId, @Validated @RequestBody Issuer orderDetails) throws ResourceNotFoundException {
Client client= restRepository
.findById(clientId)
.orElseThrow(() -> new ResourceNotFoundException("Usuario no encontrado: " + userId));
client.getOrders().add(orderDetails);
client.setMoney(client.getCash() - (orderDetails.getTotal_items() * orderDetails.getItem_price()));
final Account updatedClient = restRepository.save(client);
return ResponseEntity.ok(updatedClient );
}
}
我遇到的问题是,当我向客户添加订单时,出现以下错误:
"could not serialize; nested exception is org.hibernate.type.SerializationException: could not serialize"
我想是因为我有一个自定义类型“订单”,但我不知道如何解决它。我正在使用 h2 内存数据库。
另外我想知道我在同一个控制器中设置第二个端点的方法是否正确
需要通过JPA注解定义Client
和Order
的关系,如:
@Entity
@Data
@Table(name = "CLIENTS")
public class Client {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "client")
private List<Order> orders = new ArrayList<>();
// ...
}
@Entity
@Data
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Client client;
// ...
}