英文:
Internal Server Error on Post Request Spring Boot [Java]
问题
抱歉,我无法完成您的请求。
英文:
I am trying to send a post request to add an User object to the list of users (no database).
getUser, getAllUsers Api endpoints are working fine and giving desired results.
When I send a Post request with User, it is always giving 500 Internal Server Error.
I have also printed out the User and data is fine.
Below is my code -
User Entity (User.java) -
public class User {
private Integer userId;
private String name;
private String email;
private Account account;
Getters and Setters along with constructors are also there.
My User Service and its implementation -
UserService.java -
@Service
public interface UserService {
public User getUser(Integer userId);
public List<User> getAllUsers();
<T> ResponseEntity<T> deleteUser(Integer userId);
<T> ResponseEntity<User> addUser(User user);
}
UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService{
List<User> userList = List.of(
new User(1311, "Vaibhav Shrivastava", "innomightmail@gmail.com"),
new User(1312, "Varun Shrivastava", "varun@gmail.com"),
new User(1313, "Rajesh Shrivastava", "rajesh@gmail.com")
);
@Override
public User getUser(Integer id) {
// TODO Auto-generated method stub
System.out.println(this.userList.stream().filter(user -> user.getUserId().equals(id)).findAny().orElse(null));
return this.userList.stream().filter(user -> user.getUserId().equals(id)).findAny().orElse(null);
}
@Override
public List<User> getAllUsers() {
// TODO Auto-generated method stub
return userList;
}
@Override
public <T> ResponseEntity<User> addUser(User user) {
// TODO Auto-generated method stub
userList.add(user);
return new ResponseEntity<User>((User)user, HttpStatus.OK);
}
Controller (UserController.java) -
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{userId}")
public User getUser(@PathVariable("userId") Integer userId) {
User user = this.userService.getUser(userId);
Account account = this.restTemplate.getForObject("http://account-service/account/user/" + user.getUserId(), Account.class);
user.setAccount(account);
return user;
}
@GetMapping("/all-users")
public List<User> getAllUsers(){
return this.userService.getAllUsers();
}
@PostMapping("/add-user")
public ResponseEntity<Object> addUser(@RequestBody User user) {
try {
User newUser = new User(user.getUserId(), user.getName(), user.getEmail());
this.userService.addUser(newUser);
return new ResponseEntity<>(user, HttpStatus.CREATED);
} catch (Exception e) {
User newUser = new User(user.getUserId(), user.getName(), user.getEmail());
return new ResponseEntity<>(newUser, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
getUser and getAllUsers are working fine (dont get confused by account in getUser that is my another microservice)
When I am sending Post request using postman -
{
"userId": 1314,
"name": "James",
"email": "james@gmail.com"
}
I am getting response -
500 Internal server error and User object which I wanted to check so I printed it out -
{
"userId": 1314,
"name": "Kavita Shrivastava",
"email": "kavita@gmail.com",
"account": null
}
I do not know why I am getting Internal server error.
The request should add the new User to the list in UserServiceImpl.
答案1
得分: 2
堆栈跟踪包含您正在寻找的所有信息。 UserServiceImple.addUser
尝试向 userList
添加一个对象。但 userList
是一个不可变列表,所以它引发异常。代码流程到 "catch" 块,然后返回 500,同时返回新创建的对象。
英文:
Stack trace has all the information you are looking for. UserServiceImple.addUser
tries to add an object to the userList
. but userList
is an immutable list. so it throws exception. code flows to "catch" block and it returns 500 with newly created object.
答案2
得分: 1
根据我的看法,这是因为当你使用List.of时,它等同于Collections.unmodifiableList,因此如果尝试修改它,会引发异常,因为它是不可变的。
英文:
In my opinion That's happens because
when U use List.of it equals to
Collections.unmodifiableList so it will throw an exception as Its Immutable.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论