springssm에서 발생한 예외(Permission_$_jvstac4_1.toString, of type'com.sun.proxy.)

5118 단어 ExceptionSpringSSM

본고는 주로 두 개의springssm에서 만나는 이상을 소개한다.

  • 첫 번째


  • 1.1 exception1-test
    1.1.1 이상 정보
    Method threw 'org.apache.ibatis.reflection.ReflectionException' exception. Cannot evaluate com.banma.domain.Permission_$$_jvstac4_1.toString()
    1.1.2 이상 장면
    1)springmvc 다중 테이블 조회에서 지연 불러오기를 사용합니다.서비스 층에서 테스트를 합니다. 로드 지연이기 때문에 10줄 코드를 쓰지 않으면 결과가 틀리지 않습니다. 인터럽트를 쳐서 데이터가 조회되었는지 확인하면 두 번째 테이블이null로 조회되고 이 이상이 목록에 나타납니다.
    2) 테스트 코드
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration({"classpath:applicationContext.xml","classpath:spring-security.xml"})
    public class App2 {
        @Autowired
        private IUserDao userDao;
    
        @Test
        public void test2(){
            SysUser sysUser = userDao.finById(1);
            sysUser.getRoles().get(0).getRoleDesc();
            System.out.println(sysUser);
        }
    }

    1.1.3 이상 분석 과정
    1) mybatis가 제어하는dao층에 문제가 있음을 알 수 있다. 단지 두 군데,
    우선 프로필에 문제가 없다는 것을 확인해야 한다.첫째: 검색 문장, 둘째: 방법 반환 값
    2) 데이터베이스에서 조회하여 가져온 sql 문장이라면 첫 번째는 제외할 수 있다
    3) 방법 자체는 우선 호출에 있어서 고려하지 않아도 된다. 만약에 방법 자체에 문제가 있다면 서비스층의 호출이 잘못되었는지 검사해도 소용없다. 그래서 방법 자체에 두 가지가 있다. 반환값 유형이 틀렸는지 여부(이 이상이 바로 이것이다).반환된 실체 클래스에 대응하는 속성 및 set/get 방법
    4) 결과 검사 후 발견 시 방법의 반환 List 집합에서 실체 클래스가 잘못되었습니다. 왜냐하면 Role 클래스에 또 다른 실체 클래스 대상 속성이 있기 때문입니다
    @Select("select r.* from sys_user_role ur inner join sys_role r on ur.roleid=r.id where ur.userid=#{userId}")
    @Results({
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "permissions",column = "id",javaType = List.class,
            many = @Many(select = "com.banma.dao.IPermissionDao.findPermissionsByRoleId",
            fetchType = FetchType.LAZY))
    })
    List findRolesByUserId(Integer userId);
    public class Role {
        private Long id;
        private String roleName;
        private String roleDesc;
        private List permissions;

    1.1.4 예외 솔루션
    1) 반환값 유형 수정
    List findRolesByUserId(Integer userId);
  • 두 번째


  • 2.1 exception1-test
    2.1.1 예외 정보
    Bean named 'orderServiceImpl' is expected to be of type 'com.banma.service.impl.OrderServiceImpl' but was actually of type 'com.sun.proxy.$Proxy71'
    2.1.2 이상 장면
    1)springmvc에서의 구현 페이지 방법은 타임즈의 이상을 호출하여 플러그인을 사용하여 페이지 나누기 효과를 실현하고 사물 지원을 추가합니다
    2) 테스트 코드
    @Controller
    @RequestMapping("/order")
    public class OrderController {
        @Autowired
        private OrderServiceImpl orderService;
    
        /**
         *  
         * @return
         */
        @RequestMapping("/findByPage")
        public ModelAndView findByPage(
                @RequestParam(defaultValue = "1") int pageNum,
                @RequestParam(defaultValue = "2") int pageSize){
            PageInfo pageInfo = orderService.findByPage(pageNum, pageSize);
            ModelAndView mv = new ModelAndView();
            mv.addObject("pageInfo",pageInfo);
            mv.setViewName("order-list");
            return mv;
        }
    @Service
    @Transactional
    public class OrderServiceImpl implements IOrderService {
    
        @Autowired
        private IOrderDao orderDao;
        @Override
        public List findAll() {
            return orderDao.findAll();
        }
    
        /**
         *  
         */
        @Override
        public PageInfo findByPage(int pageNum,int pageSize) {
            // 
            PageHelper.startPage(pageNum,pageSize);
            // dao 
            List list = orderDao.findAll();
            PageInfo pageInfo = new PageInfo<>(list);
            return pageInfo;
        }

     
    2.1.3 이상 분석 과정
    1) 클래스를 실현하고 프록시 대상(proxy)(AOP프로그래밍)을 생성하는 문제임을 알립니다.문제가 발생할 수 있는 부분은 첫째, 프로필(사물 설정(xml: 관리자 DataSourceTransactionManager, 알림 규칙, aop 설정), 둘째, 제어층 controller와 서비스
    2) 페이지를 나누는 것을 실현하는 데 문제가 생겼기 때문에 플러그인이 제공하는 PageInfo나 PageHelper 사용이 잘못되었는지 먼저 생각할 수 있습니다. 물론 AOP 프로그래밍이 잘못되었음을 감안하면 이 과정은 프록시 대상에 사용된 것은 사무관리뿐입니다!모든 프로필에 문제가 없으면 서비스 층의 사물 설명(@Transactional), 서비스 구현 클래스를 수신하는 대상(Controller)을 보십시오. 여기에 실현 인터페이스가 있습니다. 모든 사용 에이전트가 JDK 에이전트입니다. 그러면 생성된 에이전트 대상은 인터페이스의 인용을 통해서만 구체적인 실현을 수신할 수 있습니다.
    3) 그럼 문제를 찾았네
    @Select("select r.* from sys_user_role ur inner join sys_role r on ur.roleid=r.id where ur.userid=#{userId}")
    @Results({
            @Result(id = true,property = "id",column = "id"),
            @Result(property = "permissions",column = "id",javaType = List.class,
            many = @Many(select = "com.banma.dao.IPermissionDao.findPermissionsByRoleId",
            fetchType = FetchType.LAZY))
    })
    List findRolesByUserId(Integer userId);
    public class Role {
        private Long id;
        private String roleName;
        private String roleDesc;
        private List permissions;

    2.1.4 예외 솔루션
    1) 수신 객체 수정
    @Autowired
    private IOrderDao orderDao;

    좋은 웹페이지 즐겨찾기