Я использую Spring Boot для проекта, я застрял с отложенной загрузкой.
Что я хочу сделать, это загрузить данные в мой контроллер, а затем отправить в презентабельный объект, который будет извлекать необходимую информацию, а сериализатор JSON плохо выполнит работу по созданию моего пользовательского HTTP-ответа.
проблема возникает, когда класс UserPresentation вызывает средство получения папки, ошибка общеизвестна: could not initialize proxy - no Session
.
Конечно, выборка по умолчанию для папки LAZY, и я хочу этого, но я не знаю, как подготовить объект для использования в презентации.
Я скопировал и вставил только папку, выбранную как четкую и короткую, но у меня больше коллекции внутри класса User, все они создают мне одну и ту же проблему.
Я знаю, что мог бы вызвать getter в контроллере просто для инициализации Коллекций, но я нахожу это жестким кодированием, на самом деле, если я хочу добавить что-то в презентабельный режим, мне тоже нужно сделать это в контроллере.
Я тоже пытался с @Transactional
, но не работает.
Вот мой класс:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USER_ID")
private Integer id;
@Column(unique = true)
private String email;
private String password;
@Enumerated(EnumType.STRING)
private Authority userAuthority;
@OneToMany(mappedBy = "owner", cascade = CascadeType.ALL)
private Set<Folder> ownFolders = new HashSet<>();
... getter setter
}
@RestController
public class UserController {
@GetMapping(value = "/api/user", produces = APPLICATION_JSON_VALUE)
public CustomResponseEntity userInfo() {
User currentUser = loginService.getCurrentUser();
UserPresentation userPresentation = new UserPresentation(currentUser);
return ResponseManager.respondData(userPresentation);
}
}
public class UserPresentation implements Presentable {
private User user;
public UserPresentation(User user) {
this.user = user;
}
public Integer getId() {
return user.getId();
}
public String getEmail() {
return user.getUsername();
}
public String getAuthority() {
return user.getUserAuthority().name();
}
public boolean isEnabled() {
return user.isEnabled();
}
public Integer getOwnFolders() {
Set<Folder> folderList = user.getOwnFolders();
if (folderList == null)
return 0;
return folderList.size();
}
}
Последние два, чтобы прояснить ситуацию
public class ResponseManager {
// DATA
public static ResponseEntity respondData(Presentable presentable, String token) {
CustomResponse response = new DataResponse<>(presentable);
return new ResponseEntity<>(response, HttpStatus.OK);
}
}
public class DataResponse<T extends Presentable> extends CustomResponse {
private T data;
public T getData() {
return data;
}
private void setData(T data) {
this.data = data;
}
public DataResponse(T data) {
this.setData(data);
}
@Override
public String getType() {
return DATA;
}
}