IT recording...
[Spring] 개발 중 마주한 오류들 - 1 본문
220215 개발 중 마주한 오류들 (만나서 반가웠고 앞으론 보지말자..^^)
[원문 링크]
https://adorable-aspen-d23.notion.site/Spring-c0443ed9fa2448ca8848fe5cd6801ec5
403 ERROR
- 스프링 시큐리티 403 Forbidden 에러
- 사용하는 컨트롤러를 securityConfig에 명시해 줘야 하는데 그러지 않아서 발생한 오류
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class
SecurityConfig extends WebSecurityConfigurerAdapter {
...
@Override
protected void configure(HttpSecurity http) throws Exception {
**http.csrf().disable();**
http
.authorizeRequests()
.antMatchers("/api/v1/auth/**","/", **"/api/v1/ggultip/*"**,
"/v2/api-docs", "/swagger-resources/**", "/swagger-ui/index.html", "/swagger-ui.html","/webjars/**", "/swagger/**", // swagger
"/h2-console/**",
"/favicon.ico").permitAll()
.anyRequest().authenticated(); // 나머지 API 는 전부 인증 필요
...
}
}
[Spring Security] 스프링 시큐리티 403 Forbidden 에러
Enum 값
- 아래의 enum에서 ALL 이 아니라 All 을 db에 저장했더니 ‘No enum constant’ 에러 남
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum GgultipCategoryType {
ALL("전체"),
CELEBRITY("연예인"),
STYLING("스타일링"),
EVENT("이벤트");
private final String category;
}
enum 사용하기
Message “can’t parse JSON. Raw result”
- json말고 raw로 내놔 → 어쨌든 데이터 형식이 다르다는 것
- 배열 객체를 리턴할 때 그냥 List 형태로 리턴하는게 아니라 jsonArray를 사용하여 리턴해서 해결하였다.
static List<GgultipContentResponse> getContentResponses(Ggultip ggultip){
**JSONArray jsonArray = new JSONArray();**
for(GgultipContent ggultipContent: ggultip.getContents()){
jsonArray.add(GgultipContentResponse.of(ggultipContent));
}
return jsonArray;
}
SpringBoot로 JSON 응답 보내는 방법 (GSON JsonObject, @ResponseBody, @RestController)
SpringBoot No Serializer found for class 에러
- 내가 만든 클래스에서 serializer를 찾을 수 없다
- → 내가 만든 데이터 형식을 private으로 지정하거나, getter가 없는지 확인하자
- 나는 getter추가해서 해결
**@Getter**
public class GgultipContentResponse {
...
}
No property id found for type 에러
- 진짜 너무너무너무 화가 났던 에러
- XXXRepository, XXXRepositoryImpl, XXXRepositoryCustom 이름 맞췄는지 확인하기 (이미 되어있었음)
- 필드가 잘못됐나 확인
- find, exists, count, delete 첫 이름이 이것만 된다그래서 첫 이름 그걸로도 바꿔봄 → 당연히 안됨
@Override
public boolean saveBookmark(GgultipBookmark ggultipBookmark) {
em.persist(ggultipBookmark);
return true;
}
- GgultipBookMarkRepositoryImpl
- 이렇게 적어놨었는데 querydsl은 save가 안먹는다고 해서 entitymanger사용해서 save하는 메소드를 작성했는데,
- 허무하게 그냥 save 메소드는 기본으로 존재했다...
⇒ 서비스에서 그냥 repository.save 호출
@Transactional
public void setBookmark(Long ggultip_id, Long user_id){
GgultipBookmark bookmark = ggultipBookMarkRepository.findBookmarkByGgultipIdAndUserId(ggultip_id,user_id);
if(bookmark == null){//새로 생성
Ggultip ggultip = ggultipRepository.findByGgultipId(ggultip_id);
User user = userRepository.findUserById(user_id);
GgultipBookmark ggultipBookmark = new GgultipBookmark();
ggultipBookmark.createGgultipBookmark(ggultip, user);
**ggultipBookMarkRepository.save(ggultipBookmark); //그냥 이렇게 써서 해결**
}
else{//이미 존재
if(bookmark.isBookmarkUsing()){
throw new NotFoundException(String.format("이미 북마크된 상태입니다."), NOT_FOUND_EXCEPTION);
}
else{
bookmark.setBookmark();
}
}
}
No property id found for type Project! Traversed path: App.project. 에러 (JPA 에러)
spring data jpa querydsl property not found 에러
CrudRepository: saveAll - No property saveAll found for type
해결방법 인사이트를 얻은 곳
NULL not allowed for column SQL statement: insert into
- 자꾸 BOOK_MARK_USING이 null이라서 안된다는데 분명히 지정해줬는데 이상하다하고 디버깅 해보니 id가 null이었다. 그래서 생성이 잘못 된 줄알고 그거 고쳤는데도 안되길래 일단 집에 옴
- 그 후 generatedvalue 찾아보니 commit 될 때 자동으로 생성된다네 → id는 문제가 아님
- book_mark_using이 왜 문제지 하고 계속 팠는데 결국 허무한 곳에서 발견
- 반복되는 rename으로 h2디비에 BOOK_MARK_USING 컬럼이 하나 더 생겨버린 것 ... 컬럼하나 멀쩡히 살아있는데 지정안해주니까 얘는 당연히 그러지,, → 해당 컬럼 db에서 drop 해서 해결했다
'Spring' 카테고리의 다른 글
[스프링 JPA1] 3. 컨트롤러 (0) | 2022.02.15 |
---|---|
[스프링 JPA1] 2. 도메인 개발 (0) | 2022.02.15 |
[스프링 JPA1] 1. 요구사항 분석 및 도메인 셜계 (0) | 2022.02.07 |
[스프링 MVC1] 7. 웹 페이지 만들기 (0) | 2022.02.07 |
[스프링 MVC1] 6. MVC 기본 기능 (0) | 2022.01.15 |
Comments