我与Java和Spring Boot项目一起工作,我打算进行基本设置。 GET
对单个对象的请求,应返回JSON这样的
{
"productId": “string", // id of the requested product, e.g. "vegetable-123"
"requestTimestamp": “dateTime", // datetime in UTC when requested the stock
"stock": {
"id": "string",
"timestamp":
"dateTime" "quantity": "integer"
}
}
我制作提供的模型,
@Entity
public class Product {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name ="id")
private String id;
@Column(insertable = false, updatable = false)
private java.sql.Timestamp timestamp;
@Embedded
private Stock stock;
public Product() {
}
public Product(String id, Timestamp timestamp, Stock stock) {
this.id = id;
this.timestamp = timestamp;
this.stock = stock;
}
}
@Embeddable
public class Stock {
@Id
@Column(name = "stockId")
private String id;
@Column(name = "s_timestamp")
private java.sql.Timestamp timestamp;
@Column(name = "quantity")
private int quantity;
public Stock() {
}
public Stock(String id, Timestamp timestamp, int quantity) {
this.id = id;
this.timestamp = timestamp;
this.quantity = quantity;
}
}
下面提供了存储库
@Repository
public interface ProductRepository extends CrudRepository<Product, String>{
}
服务类在这里
@Service
public class ProductService {
@Autowired
private ProductRepository repository;
public Optional<Product> findById(String id) {
return repository.findById(id);
}
public List<Product> findAll() {
return (List<Product>) repository.findAll();
}
public Product save(Product product) {
return repository.save(product);
}
}
我尝试通过以下API请求发布产品
@RestController
@RequestMapping("/api/v1/products")
public class ProductAPI {
@Autowired
private ProductService service;
@PostMapping(value = "/createProduct", consumes = "application/json", produces = "application/json")
public ResponseEntity<Product> createProduct(@RequestBody Product product) {
service.save(product);
return ResponseEntity.status(HttpStatus.CREATED).body(product);
}
}
我通过cURL
执行此操作,
$ curl -i -X POST -H "Content-Type:application/json" -d "{\"id\" : \"Apple Inc\",\"timestamp\" : \"2017-07-16T22:54:01.754Z\",\"stockId\" : \"Apple Stock\", \"s_timestamp\": \"2018-07-16T22:54:01.754Z\", \"quantity\": \"115\"}" http://localhost:8080/api/v1/products/createProduct
我立即通过终端获得响应,
HTTP/1.1 500
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Thu, 14 Feb 2019 14:04:20 GMT
Connection: close
{"timestamp":"2019-02-14T14:04:20.482+0000","status":500,"error":"Internal Server Error","message":"could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement","path":"/api/v1/products/createProduct"}
IDE正在显示消息,
java.sql.SQLException: Field 'id' doesn't have a default value
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.15.jar:8.0.15]
如何为id
提供默认值?
答案 0 :(得分:1)
这是一个错误:
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name ="id")
private String id;
JPA无法以Info的方式生成String
主键。
尝试这样的事情:
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
@Column(name = "id")
private String id;