java - Postman Get 请求返回重复的结果
问题描述
当我发出 Postman Get 请求时,它返回重复的结果。即使我的数据库中只有三条记录,Postman 也会返回数百条重复的相同记录。
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.resource</groupId>
<artifactId>akademiks</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>akademiks</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
实体类:
@Entity
@Table(name = "Chemistry")
public class Chemistry {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "date")
private Date date;
@Column(name = "question_no")
private Integer questionNo;
@Column(name = "question")
private String question;
@OneToOne(mappedBy = "question",cascade = CascadeType.ALL)
private ChemistryAnswer answer = new ChemistryAnswer();
public Chemistry() {}
public Chemistry(Date date, Integer questionNo, String question) {
this.date = date;
this.questionNo = questionNo;
this.question = question;
this.answer.setDate(date);
this.answer.setQuestionNo(questionNo);
this.answer.setQuestion(this);
}//accessors
实体类:
@Entity
@Table(name = "Chemistryanswer")
public class ChemistryAnswer {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "date")
private Date date;
@Column(name = "question_no")
private Integer questionNo;
@Column(name = "solution")
private String solution;
@Column(name = "solution_url")
private String solutionUrl;
@OneToOne
@JoinColumn(name = "question_id")
private Chemistry question;
public ChemistryAnswer() {}
public ChemistryAnswer(Integer questionNo, String solution, String solutionUrl) {
this.questionNo = questionNo;
this.solution = solution;
this.solutionUrl = solutionUrl;
}
public ChemistryAnswer(Date date, Integer questionNo) {
this.date = date;
this.questionNo = questionNo;
}
public Date getDate() {
return date;
}//accessors
jpa存储库:
@RepositoryRestResource(collectionResourceRel = "chemistry", path = "chemistry")
public interface ChemistryRepo extends JpaRepository<Chemistry, Integer> {
}
服务等级:
public interface ChemistryService {
public List<Chemistry>findAll();
public void save(Chemistry chemistry);
}
服务实现:
@Service
public class ChemistryServiceImpl implements ChemistryService {
private ChemistryRepo repo;
public ChemistryServiceImpl() {}
@Autowired
public ChemistryServiceImpl(ChemistryRepo repo) {
this.repo = repo;
}
@Override
public List<Chemistry> findAll() {
return repo.findAll();
}
@Override
public void save(Chemistry chemistry) {
Chemistry tempChemistry = new Chemistry(chemistry.getDate(),
chemistry.getQuestionNo(), chemistry.getQuestion());
ChemistryAnswer answer = tempChemistry.getAnswer();
tempChemistry.setAnswer(answer);
repo.save(tempChemistry);
}
}
休息控制器类:
@RestController
public class ChemistryController {
private ChemistryService service;
@Autowired
public ChemistryController(ChemistryService service) {
this.service = service;
}
@GetMapping("/chemistries")
public ResponseEntity<Object>findAll(){
return new ResponseEntity<Object>(service.findAll(), HttpStatus.OK);
}
@PostMapping("/chemistry")
public void save(@RequestBody Chemistry chemistry,
HttpServletResponse response) throws IOException {
service.save(chemistry);
response.sendRedirect("/chemistries");
}
}
Stacktrace 获取请求:
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.5.jar:2.12.5]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.5.jar:2.12.5]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.5.jar:2.12.5]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.12.5.jar:2.12.5]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.12.5.jar:2.12.5]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:770) ~[jackson-databind-2.12.5.jar:2.12.5]
解决方案
您面临的问题非常抽象。“邮递员返回数百个重复的相同记录。” 没有告诉我们太多。不过,我想问题是你的双向关系。尝试在模型中添加@JsonManagedReference
和@JsonBackReference
到您的双向关系,如下所示:
@JsonManagedReference
@OneToOne(mappedBy = "question",cascade = CascadeType.ALL)
private ChemistryAnswer answer = new ChemistryAnswer();
@OneToOne
@JsonBackReference
@JoinColumn(name = "question_id")
private Chemistry question;
推荐阅读
- python - 我如何解决python中的ModuleNotFoundError?
- xcode - React Native Xcode 无法构建没有 Rosetta 的 m1 芯片
- php - 如果单词长于 2 个字符,则在空格上拆分字符串
- c# - Identity Server4 在部署到生产时出现“invalid_grant”错误,但在 localhost 上工作正常
- html - 无法将具有透明背景的 .png 或任何图片添加到 HTML 页面
- python - 每次我运行我的代码时,有没有办法将不同的文本文件上传到 python?
- javascript - 重定向 URL 不适用于 Vue-MSAL
- r - R:ALTREP 可以为 Rcpp::XPtr 定义序列化程序吗?
- python - 如果没有参数或没有第二个参数,则 ctx.send 没有参数
- c++ - 使用 std::enable_if 重载 std::unique_ptr 删除器方法