Java Spring post rest无法分析对象中的对象
我正在尝试对我的spring boot后端进行post调用,以便存储一些项目。我要存储的对象中有其他对象,这是数据库的当前设计 现在我想做一个post调用,在数据库中创建partsused对象。我将这个Json对象发送到spring boot,但得到的错误是amount\u type\u id不能为null。所以我认为它不能解析对象,有人能看到我的class/json对象有什么问题吗,因为我找不到问题Java Spring post rest无法分析对象中的对象,java,json,spring,spring-boot,Java,Json,Spring,Spring Boot,我正在尝试对我的spring boot后端进行post调用,以便存储一些项目。我要存储的对象中有其他对象,这是数据库的当前设计 现在我想做一个post调用,在数据库中创建partsused对象。我将这个Json对象发送到spring boot,但得到的错误是amount\u type\u id不能为null。所以我认为它不能解析对象,有人能看到我的class/json对象有什么问题吗,因为我找不到问题 { "amount":"2", "specification":"test",
{
"amount":"2",
"specification":"test",
"partType":{
"idPartType":4,
"type":"leveringen"},
"amountType":{
"idAmountType":5,
"type":"m3"},
"project":{
"idProject":4,
"description":"test",
"isFinished":false,
"startDate":"2019-12-11",
"finishDate":null,
"name":"test2"
}
}
我的同学上了课
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
我的amounttype类
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idAmountType;
private String type;
错误消息
{
"cause": {
"cause": {
"cause": null,
"message": "Column 'amount_type_id' cannot be null"
},
"message": "could not execute statement"
},
"message": "could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"
}
在子实体中,您通过在
AmountType
,PartType
,项目
类中执行@GeneratedValue(strategy=GenerationType.IDENTITY)
来生成id。但是,您也从JSON本身发送id值。这就是问题所在
因此,首先,从子实体中删除@GeneratedValue(strategy=GenerationType.IDENTITY)
代码
第二,将CascadeType.ALL
添加到映射中
我在我的机器上试过,它成功了
下面给出了我尝试的代码
AmountType.java
@Entity
@Getter
@Setter
@Table(name="amount_type")
public class AmountType {
@Id
@JsonSerialize
private Long idAmountType;
private String type;
}
@Data
@Entity
@Table(name="part_type")
public class PartType {
@Id
@JsonSerialize
private Long idPartType;
private String type;
}
@Data
@Entity
@Table(name="project")
public class Project {
@Id
private Long idProject;
private String description;
private boolean isFinished;
private String startDate;
private String finishDate;
private String name;
}
@Entity
@Table(name = "parts_used")
@Getter
@Setter
@NoArgsConstructor
public class PartsUsed {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
}
PartType.java
@Entity
@Getter
@Setter
@Table(name="amount_type")
public class AmountType {
@Id
@JsonSerialize
private Long idAmountType;
private String type;
}
@Data
@Entity
@Table(name="part_type")
public class PartType {
@Id
@JsonSerialize
private Long idPartType;
private String type;
}
@Data
@Entity
@Table(name="project")
public class Project {
@Id
private Long idProject;
private String description;
private boolean isFinished;
private String startDate;
private String finishDate;
private String name;
}
@Entity
@Table(name = "parts_used")
@Getter
@Setter
@NoArgsConstructor
public class PartsUsed {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
}
Project.java
@Entity
@Getter
@Setter
@Table(name="amount_type")
public class AmountType {
@Id
@JsonSerialize
private Long idAmountType;
private String type;
}
@Data
@Entity
@Table(name="part_type")
public class PartType {
@Id
@JsonSerialize
private Long idPartType;
private String type;
}
@Data
@Entity
@Table(name="project")
public class Project {
@Id
private Long idProject;
private String description;
private boolean isFinished;
private String startDate;
private String finishDate;
private String name;
}
@Entity
@Table(name = "parts_used")
@Getter
@Setter
@NoArgsConstructor
public class PartsUsed {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
}
PartsUsed.java
@Entity
@Getter
@Setter
@Table(name="amount_type")
public class AmountType {
@Id
@JsonSerialize
private Long idAmountType;
private String type;
}
@Data
@Entity
@Table(name="part_type")
public class PartType {
@Id
@JsonSerialize
private Long idPartType;
private String type;
}
@Data
@Entity
@Table(name="project")
public class Project {
@Id
private Long idProject;
private String description;
private boolean isFinished;
private String startDate;
private String finishDate;
private String name;
}
@Entity
@Table(name = "parts_used")
@Getter
@Setter
@NoArgsConstructor
public class PartsUsed {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
}
这是接收创建零件的POST请求的控制器
@PostMapping(value = "/test")
public String test(@RequestBody PartsUsed partsUsed) {
jpaRepositoryTest.save(partsUsed);
return "test";
}
这就是我使用您的有效负载发送请求的方式。
这就是数据插入表中的方式。我使用了h2数据库
我希望它能帮助您:)在您的子实体中,您通过在
AmountType
,PartType
,Project
类中执行@GeneratedValue(strategy=GenerationType.IDENTITY)
来生成id。但是,您也从JSON本身发送id值。这就是问题所在
因此,首先,从子实体中删除@GeneratedValue(strategy=GenerationType.IDENTITY)
代码
第二,将CascadeType.ALL
添加到映射中
我在我的机器上试过,它成功了
下面给出了我尝试的代码
AmountType.java
@Entity
@Getter
@Setter
@Table(name="amount_type")
public class AmountType {
@Id
@JsonSerialize
private Long idAmountType;
private String type;
}
@Data
@Entity
@Table(name="part_type")
public class PartType {
@Id
@JsonSerialize
private Long idPartType;
private String type;
}
@Data
@Entity
@Table(name="project")
public class Project {
@Id
private Long idProject;
private String description;
private boolean isFinished;
private String startDate;
private String finishDate;
private String name;
}
@Entity
@Table(name = "parts_used")
@Getter
@Setter
@NoArgsConstructor
public class PartsUsed {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
}
PartType.java
@Entity
@Getter
@Setter
@Table(name="amount_type")
public class AmountType {
@Id
@JsonSerialize
private Long idAmountType;
private String type;
}
@Data
@Entity
@Table(name="part_type")
public class PartType {
@Id
@JsonSerialize
private Long idPartType;
private String type;
}
@Data
@Entity
@Table(name="project")
public class Project {
@Id
private Long idProject;
private String description;
private boolean isFinished;
private String startDate;
private String finishDate;
private String name;
}
@Entity
@Table(name = "parts_used")
@Getter
@Setter
@NoArgsConstructor
public class PartsUsed {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
}
Project.java
@Entity
@Getter
@Setter
@Table(name="amount_type")
public class AmountType {
@Id
@JsonSerialize
private Long idAmountType;
private String type;
}
@Data
@Entity
@Table(name="part_type")
public class PartType {
@Id
@JsonSerialize
private Long idPartType;
private String type;
}
@Data
@Entity
@Table(name="project")
public class Project {
@Id
private Long idProject;
private String description;
private boolean isFinished;
private String startDate;
private String finishDate;
private String name;
}
@Entity
@Table(name = "parts_used")
@Getter
@Setter
@NoArgsConstructor
public class PartsUsed {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
}
PartsUsed.java
@Entity
@Getter
@Setter
@Table(name="amount_type")
public class AmountType {
@Id
@JsonSerialize
private Long idAmountType;
private String type;
}
@Data
@Entity
@Table(name="part_type")
public class PartType {
@Id
@JsonSerialize
private Long idPartType;
private String type;
}
@Data
@Entity
@Table(name="project")
public class Project {
@Id
private Long idProject;
private String description;
private boolean isFinished;
private String startDate;
private String finishDate;
private String name;
}
@Entity
@Table(name = "parts_used")
@Getter
@Setter
@NoArgsConstructor
public class PartsUsed {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonSerialize
private Long idPartsUsed;
private int amount;
private String specification;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "part_type_id", referencedColumnName = "idPartType")
private PartType partType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "amount_type_id", referencedColumnName = "idAmountType")
private AmountType amountType;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "project_id", referencedColumnName = "idProject")
private Project project;
}
这是接收创建零件的POST请求的控制器
@PostMapping(value = "/test")
public String test(@RequestBody PartsUsed partsUsed) {
jpaRepositoryTest.save(partsUsed);
return "test";
}
这就是我使用您的有效负载发送请求的方式。
这就是数据插入表中的方式。我使用了h2数据库
我希望它能帮助您:)找到问题
我认为,当spring使用@RepositoryRestResource创建自己的端点时,它的功能与使用@RestController+@PostMapping创建自己的端点时不同。当我使用自己的rest控制器时,它获得了amount类型的id以及其他对象
这是我的存储库,我不知道我的设置方式是否有任何问题,但现在它工作了
@Repository("PartsUsedRepository")
@RepositoryRestResource(collectionResourceRel = "results", path = "partsused")
public interface PartsUsedRepository extends PagingAndSortingRepository<PartsUsed, Long> {
}
@Repository(“PartsUsedRepository”)
@RepositoryRestResource(collectionResourceRel=“results”,path=“partsused”)
公共接口部件使用的存储库扩展了分页和排序存储库{
}
找到了问题
我认为,当spring使用@RepositoryRestResource创建自己的端点时,它的功能与使用@RestController+@PostMapping创建自己的端点时不同。当我使用自己的rest控制器时,它获得了amount类型的id以及其他对象
这是我的存储库,我不知道我的设置方式是否有任何问题,但现在它工作了
@Repository("PartsUsedRepository")
@RepositoryRestResource(collectionResourceRel = "results", path = "partsused")
public interface PartsUsedRepository extends PagingAndSortingRepository<PartsUsed, Long> {
}
@Repository(“PartsUsedRepository”)
@RepositoryRestResource(collectionResourceRel=“results”,path=“partsused”)
公共接口部件使用的存储库扩展了分页和排序存储库{
}
请发布更多信息,如您收到的错误、API代码等etc@SurajGautam我已经为你添加了错误信息,我刚刚得到一个基本的400码Hi,为什么要在AmountType类中自动递增idAmountType的主键并以json格式发送?@SurajGautam我想我需要为post调用指定id,否则它会在数据库中创建一个新的AmountType,我不希望这样,我希望它链接到您请求中的激活AmountType,“amount”:“2”,但是在partsused类中,amount数据类型是int,您可以尝试在请求中使用“amount”:2吗?请发布更多信息,如您得到的错误、API代码等etc@SurajGautam我已经为你添加了错误信息,我刚刚得到一个基本的400码Hi,为什么要在AmountType类中自动递增idAmountType的主键并以json格式发送?@SurajGautam我想我需要为post调用指定id,否则它会在数据库中创建一个新的AmountType,我不希望这样,我希望它链接到您请求中的激活AmountType,“amount”:“2”,但是在partsused类中amount数据类型是int,您可以在请求中尝试使用“amount”:2吗?