일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- appspec.yml
- ubuntu
- 포트
- WeNews
- 서브쿼리
- Query
- 메소드명
- 테스트메소드
- 커밋메세지수정
- 참조키
- subquery
- 적용우선순위
- AuthenticationEntryPoint
- docker명령어
- application.yml
- 검색
- 컨테이너실행
- MySQL
- 추후정리
- ㅔㄴ션
- 테스트
- appspec
- foreignkey
- 네이티브쿼리
- EC2
- querydsl
- 예약
- 외부키
- 2 > /dev/null
- 메세지수정
- Today
- Total
제뉴어리의 모든것
[JAVA] Parameter타입객체.getName() 이 arg0, arg1 로 나올때... 본문
상황
아래의 소스를 보자.
Parameter 객체에서 getName() 메소드를 이용하여, 파라미터명을 가져오려고 했다.
@Aspect
@Component
@RequiredArgsConstructor
public class TxAspect {
private final PlatformTransactionManager transactionManager;
@Around("@annotation(com.preproject.server.tx.NeedMemberId)") //NeedMemberId를 붙인 메소드에
public Object applyTx(ProceedingJoinPoint joinPoint) throws Throwable {
TransactionStatus transaction = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
Object[] parameterValues = joinPoint.getArgs(); //우선 현재 Controller로 넘어 온 파라미터 값들을 가져 옴
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); //SecurityContext에 저장된 Authentication 가져 옴
WrapperUserNamePasswordAuthenticationToken wUNPAT = (WrapperUserNamePasswordAuthenticationToken) authentication;
Long memberId = wUNPAT.getMemberId(); //SecurityContext에 저장된 서버가 인식하는 실제 MemberId
//조인 포인트 (호출 되는 메소드를 말한다) 가 호출되는 시점에 넘겨 받은 인자값들
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //메소드의 선언 부분에 대한 정보
Method method = signature.getMethod(); //메소드 자체의 대한 정보를 갖는 클래스
Parameter[] parameters = method.getParameters(); //메소드가 갖는 파라미터들의 정보
for (int i = 0; i < method.getParameters().length; i++) {
if (parameters[i].getName().equals("authMemberId")) { //------------- 문제의 부분
parameterValues[i] = memberId; //해당 파라미터에 위에서 Authentication을 이용하여 얻은 "memberId"를 넣음
break;
}
}
Object object = joinPoint.proceed(parameterValues); //새롭게 설정된 파라미터 값들을 해당 메소드에 전달
transactionManager.commit(transaction);
return object;
} catch (RuntimeException runtimeException) {
transactionManager.rollback(transaction);
throw runtimeException;
}
}
}
그런데,,,
문제는 내 Local에서는 잘 되지만,
해당 코드를 pull로 받아 사용하는 팀원분 인텔리제이에서는 정상적으로 작동하지 않아서 보니
"문제의 부분" 인
if (parameters[i].getName().equals("authMemberId")) 코드에서
authMemberid란 파라미터명의 파라미터를 찾지 못하였다.
그래서 확인해보니...
모든 파라미터명이 단순히 순서에 따라,
arg0, arg1, arg2 .... 이런식으로 넘어왔다.
에러 메세지
원인
원인은 아직도 정확히는 모르겠다..
그러나, 이것저것 구글링을 하다보니
자바 버전에따라 특정 옵션을 넣어줘야 정상적으로 필드명을 가져오고
그렇지 않으면,
arg0, arg1 ... 이런식으로 가져온다고 하였다.
그래서 동료분들의 intellij의 java 버전을 확인 하던 중,
팀원분의 제안으로
아래 해결방법과 같이 해주니 정상적으로 작동하였다...
즉, intellij 내부적으로 빌드, 컴파일 할때의 java 버전과 gradle로 빌드, 컴파일 할때의 java 버전이 다른듯하다..
그런데, 아무리 봐도 동료분의 세팅과 내 세팅을 보면 모두 자바 자바 11 로 동일하다..
해결 방법
윈도우 기준으로 FIle -> Settings 들어가서
Gradle 항목에서 우측 화면의 중간쯤 보면
- Build and run using
- Run tests using
항목들이 있을것이다.
해당 항목들 모두 Gradle이라고 바꿔 넣어라.
결론
빌드, 컴파일을 뭘로할지
java 버전이 뭘지에 따라 메소드의 작동이 달라질 수도 있다...
참고
아래는 해결 방법이라고 했던 것들인데, 현재 내 경우에서는 되진 않았다. 그냥 참고만,,
https://csy7792.tistory.com/311
https://kim-jong-hyun.tistory.com/122
intellij의 java 버전 확인
https://effectivecode.tistory.com/1366
Parameter.getName() 의 공식문서
'BugNote' 카테고리의 다른 글
mustache 사용 시 페이지에 한글이 물음표로 깨져 나올 때 (0) | 2023.03.09 |
---|---|
HttpServletResponse getWriter()를 사용하여 직접 body를 넣어줄때 한글 출력 안됨 현상 (0) | 2022.10.31 |
non-static inner classes like this can only by instantiated using default, no-argument constructor 에러 (1) | 2022.10.21 |
UsernamePasswordAuthenticationFilter 를 상속받아 재구현 할때 조심할것 (0) | 2022.10.19 |
Spring Boot 프로젝트에서 코드상에 application.properties 값 가져 올때 주의 점 (0) | 2022.10.19 |