java - 如何修复 Spring Boot 中的 500 内部错误
问题描述
我真的很难解决restapi中的500个内部错误。
当我使 GET 和 POST 请求正常工作但当我使 PUT、DELETE 和 findById GET 请求不起作用时。如果我尝试发出请求,它将显示 500 内部错误。我不知道为什么会这样,所以请帮助我。先感谢您!Family1.class
@Entity
public class Family1 {
@Id
private long id;
private String Name;
private int Member;
private long contactNo;
@Embedded
public Address address;
// getters,setters
Family1Controller.class
@RestController
@RequestMapping(value = "/family1")
public class Family1Controller {
@Autowired
private Family1Service family1Service;
@RequestMapping("/fam1")
public List<Family1> getAllFamily1(){
return family1Service.getAllFamily1();
}
@RequestMapping(method=RequestMethod.POST,value="/fam1")
public void addFamily1(@RequestBody Family1 family1){
family1Service.addFamily1(family1);
}
@RequestMapping(method=RequestMethod.GET,value="/fam1/{id}")
public Family1 getFamily1Id(@PathVariable long id) {
List<Family1> family=family1Service.getFamily1Id(id);
return family.get((int) id);
}
@RequestMapping(method=RequestMethod.PUT,value="/fam1/{id}")
public Family1 updateFamily1(@RequestBody Family1 family1, @PathVariable("id") long id){
family1.setId(id);
return family1Service.updateFamily1(family1);
}
@RequestMapping(method=RequestMethod.DELETE,value="/fam1/{id}")
public void deleteFamily1(@PathVariable("id") long id) {
family1Service.deleteFamily1(id);
}
}
Family1Service.class
@Service
public class Family1Service {
private Family1Repository family1Repository;
private List<Family1> family=new ArrayList<>(Arrays.asList(
new Family1(1,"abc",3,32423423,new Address("east street","xxxxxx",23456)),
new Family1(2,"xyz",4,354646,new Address("west street","yyyyyy",23456)),
));
public List<Family1> getAllFamily1() {
return family;
}
public List<Family1> getFamily1Id(long id){
family1Repository.findById(id);
return family;
}
public void addFamily1(Family1 family1) {
family.add(family1);
}
public Family1 updateFamily1(Family1 family1) {
return family1Repository.save(family1);
}
public void deleteFamily1(long id) {
family1Repository.deleteById(id);
}
}
Family1Repository.class
public interface Family1Repository extends CrudRepository<Family1, String> {
public void deleteById(long id);
public void save(Family1 family1, long id);
public void findById(long id);
Family1application.class
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class Family1Application {
public static void main(String[] args) {
SpringApplication.run(Family1Application.class, args);
}
}
错误:
{
"timestamp": "2021-01-06T07:32:49.232+00:00",
"status": 500,
"error": "Internal Server Error",
"message": "",
"path": "/family1/fam1/1"
}
解决方案
您正在混合对预定义列表的调用与对存储库的调用。列表中的元素在数据库中没有表示,因此当您使用这些 ID 删除存储库中的对象时,它们是无效的。
您可能想尝试这样的事情:
@Service
public class Family1Service {
private Family1Repository family1Repository;
public List<Family1> getAllFamily1() {
return family1Repository.findAll();
}
public Family1 getFamily1Id(long id){
return family1Repository.findById(id).orElseThrow();
// This returns an Optional orElseThrow will create an error if nothing is found
}
public void addFamily1(Family1 family1) {
family1Repository.save(family1);
}
public Family1 updateFamily1(Family1 family1) {
return family1Repository.save(family1);
}
public void deleteFamily1(long id) {
family1Repository.deleteById(id);
}
}
在控制器中:
@RestController
@RequestMapping(value = "/family1")
public class Family1Controller {
@Autowired
private Family1Service family1Service;
@RequestMapping("/fam1")
public List<Family1> getAllFamily1(){
return family1Service.getAllFamily1();
}
@RequestMapping(method=RequestMethod.POST, value="/fam1")
public void addFamily1(@RequestBody Family1 family1){
family1Service.addFamily1(family1);
}
@RequestMapping(method=RequestMethod.GET, value="/fam1/{id}")
public Family1 getFamily1Id(@PathVariable long id) {
return family1Service.getFamily1Id(id);
}
@RequestMapping(method=RequestMethod.PUT, value="/fam1")
public Family1 updateFamily1(@RequestBody Family1 family1){
return family1Service.updateFamily1(family1);
}
@RequestMapping(method=RequestMethod.DELETE, value="/fam1/{id}")
public void deleteFamily1(@PathVariable("id") long id) {
family1Service.deleteFamily1(id);
}
}
public interface Family1Repository extends CrudRepository<Family1, long> {
// All repository methods you need are already provided by the CrudRepository
}
我删除了您在 中使用的列表,Family1Service
以避免数据库中不存在数据。findAll()
这可能会在调用存储库的方法时导致空结果。
请注意,我没有时间对此进行全面测试,但一般方法应该可行。
推荐阅读
- github-actions - github.token 与 secrets.github_token 的区别?
- microsoft-teams - MS Teams 集成 - 租户管理员权限问题
- javascript - 如何在reactjs的双重列表中添加和编辑列表项?
- python - python goaleek 求解贴现率变量
- spring - Spring,JPA:如何使用多对多关系桥表设置查询另一个实体下的实体
- unity3d - 如何统一正确使用 Firebase.Firestore.FieldValue.ServerTimestamp?
- ios - 如何测量非暂停时间经过
- docker - 如何从 docker 容器中运行的 Web 服务中获取客户端 IP?
- email - 我们如何在 Azure DevOps 中导出用户及其首选电子邮件地址
- java - 如何知道一个包包含在哪个模块中?