일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- application.yml
- 외부키
- subquery
- 테스트메소드
- Query
- 검색
- 컨테이너실행
- WeNews
- 참조키
- EC2
- 적용우선순위
- 예약
- docker명령어
- 메소드명
- querydsl
- 테스트
- ubuntu
- MySQL
- foreignkey
- appspec.yml
- 서브쿼리
- appspec
- ㅔㄴ션
- 추후정리
- 포트
- 커밋메세지수정
- 메세지수정
- 네이티브쿼리
- AuthenticationEntryPoint
- 2 > /dev/null
- Today
- Total
제뉴어리의 모든것
non-static inner classes like this can only by instantiated using default, no-argument constructor 에러 본문
non-static inner classes like this can only by instantiated using default, no-argument constructor 에러
제뉴어리맨 2022. 10. 21. 01:07상황
아래에 전체 코드중 아래 라인에서 에러가 발생하였다.
LoginDto loginDto = objectMapper.readValue(request.getInputStream(), LoginDto.class);
request의 body 부분을 LoginDto라는 클래스로 매핑을 하려고 하였다.
그리고 request는 포스트맨에서 아래와 같이 보내주었다.
즉, 아래의 클래스와 매핑을 시키려고 했던것이다.
private class LoginDto{
private String username;
private String password;
}
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private final AuthenticationManager authenticationManager;
private final JwtTokenizer jwtTokenizer;
@SneakyThrows
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
ObjectMapper objectMapper = new ObjectMapper();
//에러 부분
LoginDto loginDto = objectMapper.readValue(request.getInputStream(), LoginDto.class);
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(loginDto.getUsername(),loginDto.getPassword());
return authenticationManager.authenticate(authenticationToken);
}
:
:
@Setter
@Getter
private class LoginDto{
private String username;
private String password;
}
}
에러메세지
non-static inner classes like this can only by instantiated using default, no-argument constructor
해결방법
처음에는 에러 메세지의 내용대로
인자가 없는 기본 생성자만 넣어주면 된다고생각하였다.
그래서
LoginDto에
@NoArgsConstructor 에너테이션만 붙여주면 될줄 알았는데,
똑같은 에러가 발생되었다.
그런데 구글링을 해보고 생각해보니 당연한 실수였다.
현재 static 하지 않은 LoginDto는 내부 클래스이기에 LoginDto를 포함하고 있는 클래스인
JwtAuthenticationFilter 클래스를 생성하여 참조하는형태로 생성을 해주어야한다.
바로 아래와 같이 생성을 해주어야한다.
new JwtAuthenticationFilter().LoginDto()
그러나 내부적으로 위와 같이 처리가 안되서,
그런것이다.
그러므로
해결방법은 두가지이다.
1.
LoginDto 클래스에 static을 붙여준다.
또는
2. LoginDto 클래스를 중첩클래스로 만들지 않고,
따로 클래스를 하나 만드는것이다.
'BugNote' 카테고리의 다른 글
HttpServletResponse getWriter()를 사용하여 직접 body를 넣어줄때 한글 출력 안됨 현상 (0) | 2022.10.31 |
---|---|
[JAVA] Parameter타입객체.getName() 이 arg0, arg1 로 나올때... (0) | 2022.10.31 |
UsernamePasswordAuthenticationFilter 를 상속받아 재구현 할때 조심할것 (0) | 2022.10.19 |
Spring Boot 프로젝트에서 코드상에 application.properties 값 가져 올때 주의 점 (0) | 2022.10.19 |
@EnableJpaAuditing과 @SpringBootApplication 을 같이 쓸때, Test에서 발생되는 에러 (0) | 2022.10.10 |