Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring post rest无法分析对象中的对象_Java_Json_Spring_Spring Boot - Fatal编程技术网

Java Spring post rest无法分析对象中的对象

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",

我正在尝试对我的spring boot后端进行post调用,以便存储一些项目。我要存储的对象中有其他对象,这是数据库的当前设计

现在我想做一个post调用,在数据库中创建partsused对象。我将这个Json对象发送到spring boot,但得到的错误是amount\u type\u id不能为null。所以我认为它不能解析对象,有人能看到我的class/json对象有什么问题吗,因为我找不到问题

{
    "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吗?