使用自定义类型创建 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注解定义ClientOrder的关系,如:

@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;

    // ...
}