Development/Daily Error

일간 에러 2021-11-19

📝 작성 : 2021.11.19  ⏱ 수정 : 
반응형

I cannot be cast to java.lang.Integer

문제

JPA Restrictions의 in 절 파라미터에 int 배열을 전달 했더니, 쿼리를 만들어 내지 못하며 I cannot be cast to java.lang.Integer 에러가 발생했다.

int[] actions = { Constants.READ, Constants.ADMIN, Constants.SUBMIT, Constants.REVIEW,Constants.WORKFLOW }
Restrictions.in("actionId", actions)));

해결 과정

혹시 쿼리에는 String만 들어가야 하나 해서 Parameter를 String 배열로 변환 해 전달 해 보았다.

Arrays.stream(collectionMembers).map(i -> String.valueOf(i)).collect(Collectors.toList());
List<String> collectionMembers = Arrays.stream(new Integer[] { Constants.READ, Constants.ADMIN, Constants.SUBMIT, Constants.REVIEW,Constants.WORKFLOW }) 
    .map(i -> String.valueOf(i)) 
    .collect(Collectors.toList());

했더니 java.lang.String cannot be cast to java.lang.Integer 에러가 발생한다.

하긴, JPA 프로퍼티가 이미 Integer로 되어 있는데, 쿼리로 바로 String을 보내는게 아니고 JPQL이 먼저 만들어져야 하는데 쿼리 생각하며 String을 전달한다는게 될리가 없다.

그래서 파라미터로 List<Integer>를 만들어 보내 봤더니 잘 되었다.

image-20211119114733253

그런데 분명 파라미터로 Collection을 받는데 배열을 넣어도 메서드가 에러가 뜨지 않았다. 배열은 Collection이 아닌데.. 배열도 상관 없이 작동하나? 라는 생각을 했다.



그래서 이번엔 애초에 int 배열을 넣었다가 문제가 발생했으니 Integer 배열을 전달 해 보았다. 파라미터는 Object 배열로 받고..

public List<Policy> findByMemberAndItemInActions(Context context, Member user, item Item, Object[] actions) {
    Criteria criteria = createCriteria(context, Policy.class) //
        .add(Restrictions.and( //
            Restrictions.eq("item", Item), //
            Restrictions.eq("Member", user), //
            Restrictions.in("actionId", actions)));
    List<Policy> result = list(criteria);
    return result;
}
Integer[] collectionMembers = { Constants.READ, Constants.ADMIN, Constants.SUBMIT, Constants.REVIEW,
                        Constants.WORKFLOW };

그랬더니 이번에는 오류는 나오지 않는데, 의도대로 동작 하지가 않는다. 어쩐지 Collection 을 파라미터로 받는데 배열이 들어가는 것 부터가 영 수상해서 다시 한번 자세히 in 메서드의 스펙을 살펴 보았더니..

image-20211119124045530

오버로딩 된 또 다른 메서드가 보인다.. 배열이 저 Object 자리에 들어갔으니 제대로 동작 할리가 없다.

해결

Collection<Integer> 를 만들어 파라미터로 보낸 뒤, Restrictions.in에 전달하니 의도한 대로 동작 하였다.

Arrays.stream(new Integer[] { Constants.READ, Constants.ADMIN,
                        Constants.SUBMIT, Constants.REVIEW, Constants.WORKFLOW }).collect(Collectors.toList());

결론

메서드의 요구 스펙을 정확하게 확인 하고 올바른 파라미터를 전달 하자.

반응형