【发布时间】:2020-09-02 08:44:35
【问题描述】:
我是这个主题的新手,当我尝试授权时,我不断收到“java.lang.StackOverflowError: null”。我在邮递员中收到内部服务器错误,在控制台中我收到 stackoveflowerror。 这是我的 AuthenticationController:
@PostMapping("/signup")
public ResponseEntity<?> registerUser(@Valid @RequestBody SignUpRequest signUpRequest) {
if (userService.existsByEmail(signUpRequest.getEmail())) {
throw new BadRequestException("email already exists");
}
User user = UserMapper.INSTANCE.registerRequestoUser(signUpRequest);
user.setPassword(passwordEncoder.encode(user.getPassword()));
Optional<Role> optionalRole = roleService.getByName("user");
if (optionalRole.isPresent()) {
Role userRole = optionalRole.get();
user.addRole(userRole);
Optional<User> optionalUser = userService.create(user);
if (optionalUser.isPresent()) {
User result = optionalUser.get();
URI location = ServletUriComponentsBuilder
.fromCurrentContextPath().path("/api/v1/users/email/{email}")
.buildAndExpand(result.getEmail()).toUri();
return ResponseEntity.created(location).body("User registered successfully");
}
}
return (ResponseEntity<?>) ResponseEntity.badRequest();
}
我的 SignUpRequest 类:
public class SignUpRequest {
@NotBlank
private String firstName;
@NotBlank
private String lastName;
@NotBlank
@Email
private String email;
@NotBlank
@Size(min = 8, max = 20)
private String password;
private Set<String> roles;
我的用户实体和我的角色实体:
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User extends BaseEntity {
private String firstName;
private String lastName;
@Email(message = "Email should be valid")
private String email;
@Size(min = 3, max = 100, message
= "password must be between 3 and 50 characters")
private String password;
@OneToMany(mappedBy = "user",
cascade = {CascadeType.PERSIST, CascadeType.MERGE,
CascadeType.DETACH, CascadeType.REFRESH})
private Set<Appointment> appointments;
@ManyToMany(targetEntity = Role.class,
cascade = {CascadeType.ALL},
fetch = FetchType.EAGER)
@JoinTable(
name = "user_role",
joinColumns = {@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "role_id")}
)
private Set<Role> roles;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Role extends BaseEntity {
@NotNull
private String name;
@ManyToMany(mappedBy = "roles")
private Set<User> users;
public String getName() {
return name;
}
这是我的邮递员请求
{
"firstName":"name",
"lastName":"name",
"email": "an@gmail.com",
"password": "thepassword123",
"roles": ["user"]
}
这是堆栈跟踪中的一部分:
at at com.project.rushhour.entity.User.hashCode(User.java:15) ~[classes/:na]
...
at at com.project.rushhour.entity.Role.hashCode(Role.java:15) ~[classes/:na]
...
at com.project.rushhour.entity.User.hashCode(User.java:15) ~[classes/:na]
...
at com.project.rushhour.entity.Role.hashCode(Role.java:15) ~[classes/:na]
...
at com.project.rushhour.entity.User.hashCode(User.java:15) ~[classes/:na]
...
at com.project.rushhour.entity.Role.hashCode(Role.java:15) ~[classes/:na]
...
我认为错误是在程序尝试解析角色时出现的,但不确定到底是什么问题。 jwt的东西设置正确,只是逻辑错了
【问题讨论】:
-
嗨,这是完整的例外pastebin.com/tU92bnKP 它很长
-
显示你的堆栈跟踪。它应该是问题的一部分。不要使用任何外部资源。
-
@MaartenBodewes:不 :) 那是不正确的。通常很少有行重复多次。通常这些是大约 15-20 行。所以粘贴 15-20 行就足够了。
-
@MaartenBodewes:我添加了堆栈跟踪的重复部分。如您所见,它占用的空间并不多:)
-
@mkashi:您没有表现出任何分析堆栈跟踪的努力,实际上您的问题应该被否决。但我喜欢你的问题是关于 StackOverflowError - 这是这个网站的名称。所以我投票赞成你的问题:)
标签: java spring hibernate spring-boot lombok