Я попытался сделать успокоительный сервер API (имея логин и управление).
Итак, я создал классы User
и Role
(на самом деле у него больше классов с той же проблемой).
Проблема возникает здесь.
Это создает бесконечную проблему вызова.
Я уже пытался использовать @JsonManagedReference
и удалить fetch=FetchType.EAGER
.
Во-первых, это ошибка печати Content type 'application/json;charset=UTF-8' not supported
. Я догадался, что это не сработало в моем спокойном API.
Еще одна такая же ошибка, бесконечный корень.
Это мой User
класс.
public class User implements UserDetails {
@Id
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String passwordQuestion;
@Column(nullable = false)
private String passwordAnswer;
@Column(nullable = false)
private String email;
@ManyToMany//(fetch = FetchType.EAGER)
@JsonManagedReference
private Set<Role> roles = new HashSet<Role>();
...
}
А это мой ролевый класс.
public class Role implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(nullable=false)
private String rolename;
@ManyToMany(cascade=CascadeType.ALL)
private Set<User> users = new HashSet<User>();
public void addUser(User user) {
users.add(user);
}
}
Как я могу решить эту проблему?
Дополнительная
Это целое сообщение об ошибке в консоли.
Я добавил @JsonBackReference
в users
и roles
и удалил @JsonManagedReference
.
2019-06-21 17:29:09.667 WARN 16596 --- [nio-8080-exec-2] .c.j.MappingJackson2HttpMessageConverter : Failed to evaluate Jackson deserialization for type [[simple type, class com.t3q.userManage.model.User]]: com.fasterxml.jackson.databind.JsonMappingException: Multiple back-reference properties with name 'defaultReference'
Это часть моего контроллера.
public class UserController {
// private static final Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowired
private UserRepository userRepository;
@Autowired
private SiteRepository siteRepository;
@Autowired
private RoleRepository roleRepository;
@Autowired
AuthenticationManager authenticationManager;
@Autowired
JwtTokenProvider jwtTokenProvider;
@Autowired
PasswordEncoder passwordEncoder;
// private CryptoUtil passwordEncoder = new CryptoUtil();
@PostMapping("/signup/{siteURL}")
public User signUp(@PathVariable String siteURL, @Valid @RequestBody User user) throws Exception {
User userSaved = getUser(user.getUsername());
// Site site = siteRepository.save(new Site(0, siteURL));
Site site = siteRepository.findBySiteURL(siteURL);
Role userRole = roleRepository.findByRolename("ROLE_USER");
Role adminRole = roleRepository.findByRolename("ROLE_ADMIN");
if (userSaved == null) {
userSaved = userRepository.save(User.builder().username(user.getUsername())
.password(passwordEncoder.encode(user.getPassword()))
.passwordQuestion(user.getPasswordQuestion())
.passwordAnswer(user.getPasswordAnswer())
.email(user.getEmail())
.roles(new HashSet<Role>() {
{
add(userRole);
add(adminRole);
}
})
.sites(new HashSet<Site>() {
{
add(site);
}
})
.build());
addUserToSite(userSaved, site);
addUserToRole(userSaved, userRole);
addUserToRole(userSaved, adminRole);
} else {
throw new Exception("User " + userSaved.getUsername() + " already exists.");
}
return userSaved;
}
...
}
Должен ли я восстановить @JsonManagedReference
?