관리 메뉴

제뉴어리의 모든것

non-static inner classes like this can only by instantiated using default, no-argument constructor 에러 본문

BugNote

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는 포스트맨에서 아래와 같이 보내주었다.

{
    "username":"hello@gmail.com",
    "password":"1234"
}

 

즉, 아래의 클래스와 매핑을 시키려고 했던것이다.

 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 클래스를 중첩클래스로 만들지 않고,

따로 클래스를 하나 만드는것이다.