728x90
오류
@Transactional
public Files savefiles(FileUploadDTO file, MultipartFile newFile, Member member) throws Exception {
if (member == null) {
throw new BusinessException(CustomErrorCode.ACCESS_DENIED);
}
Files files = fileHandler.parseFileInfo(file, newFile, member);
if (files == null) {
//파일이 없을 경우: 클라이언트 측에서 파일 데이터가 없을 경우
throw new BusinessException(CustomErrorCode.NOT_EXIST_FILE);
}
else {
fileRepository.save(files);
}
return files;
}
public class FileHandler {
private final MemberRepository memberRepository;
public Files parseFileInfo(FileUploadDTO saveFiles, MultipartFile multipartFile, Member member) throws Exception {
//반환할 파일 리스트
Files files = null;
//파일이 빈 것이 들어오면 빈것 반환
if (multipartFile.isEmpty()) {
return files;
}
// 파일 이름을 업로드 한 날짜로 바꾸어서 저장할 것이다
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
String current_date = simpleDateFormat.format(new Date());
//resources/img 에 파일 저장
String absolutePath = new File("").getAbsolutePath() + "\\src\\main\\resources\\static\\";
//경로를 지정
String path = "img/" + current_date;
File file = new File(absolutePath+path);
//저장할 위치의 디렉토리가 존재하지 않을 경우
if (!file.exists()) {
file.mkdirs();
}
//파일 handle
//파일이 비어 있지 않을 때 작업을 시작 (오류나지 않도록)
if (!multipartFile.isEmpty()) {
//jpeg, png, gif만 처리
String contentType = multipartFile.getContentType();
String originalFileExtension = null;
//확장자가 없으면 파일오류
if (ObjectUtils.isEmpty(contentType)) {
//클라이언트에게 오류 코드
;
} else {
if (contentType.contains("image/jpeg")) {
originalFileExtension = ".jpg";
} else if (contentType.contains("image/png")) {
originalFileExtension = ".png";
} else if (contentType.contains("image/gif")) {
originalFileExtension = ".gif";
} else { //다른 확장자면 무시
//클라이언트에게 오류 코드
;
}
//각 이름이 겹치면 안되므로 uuid -> 파일이름+회원username.확장자
// UUID uuid = UUID.randomUUID();
String newFileName = saveFiles.getFileName() + member.getUsername() + originalFileExtension;
// while (new File(path + "/" + newFileName).exists()) {
// newFileName = saveFiles.getFileName() + UUID.randomUUID().toString() + originalFileExtension;
// }
files = Files.builder()
.storedFileName(path + "/" + newFileName)
.Category(saveFiles.getCategory())
.Name(saveFiles.getFileName())
.License(saveFiles.getLicense())
.Summary(saveFiles.getSummary())
.member(member) //나중에 회원정보 넣기
.build();
file = new File(absolutePath + path + "/" + newFileName);
multipartFile.transferTo(file);
}
}
return files;
}
}
json으로 반환하는 과정에서 member 엔티티의 comments에서 에러가 난 것 같았다.
`Could not write JSON: failed to lazily initialize a collection of role: smw.capstone.entity.Member.comments: could not initialize proxy - no Session]`
멤버 엔티티는 아래와 같다.
package smw.capstone.entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column(name = "Member_Id")
private Long Id;
private String Email;
private String Username;
private String Password;
private int Student_Id;
@Enumerated(EnumType.STRING)
private Type type;
@OneToMany(mappedBy = "member")
public List<Comments> comments = new ArrayList<Comments>();
}
원인
Comments 객체가 초기화되지 않은 상태로 JSON으로 변환하려고 하기 때문에 에러가 발생하고 있다.
OneToMany는 기본적으로 지연로딩이다.
ManyToOne관계 양방향의 Comments에서 Member를 조회할때 영속성 컨텍스트가 종료되어 발생하는 오류
해결
Member 엔티티에 `@OneToMany(mappedBy = "team", fetch = FetchType.EAGER)` 추가
참고자료
728x90