• 一次StackOverflowError事故-----参数类型问题


    背景:公司需要做一个小程序,从把服务器数据库里面的数据拷贝到本地

    技术:spring-boot, XXL-RPC, JPA

    问题 : 客户端查询数据,调用RPC服务,一直报错 StackOverflowError:null,

    问题重现:

    数据表test

    CREATE TABLE test (
      "rid" int(11) NOT NULL AUTO_INCREMENT,
      "name" varchar(45) DEFAULT NULL,
      "age" int(11) DEFAULT NULL,
      "create_time" datetime DEFAULT NULL,
      PRIMARY KEY ("rid")
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    Test实体类

    import java.io.Serializable;
    import java.time.LocalDateTime;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    import lombok.Getter;
    import lombok.Setter;
    
    @Getter
    @Setter
    @Entity
    @Table(name = "test")
    public class TestEntity implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = -7189192698006290220L;
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "rid")
        private Integer id;
        
        private String name;
        
        private Integer age;
        
        private LocalDateTime createTime;
        
        
    }

    Repository ,使用的是JPA,具体关于JPARepository的知识,自己补习吧

    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface TestRepository extends JpaRepository<TestEntity, Integer>{
        
    }

    Service服务,直接与数据库交互的

    public interface TestService {
        TestEntity save(TestEntity entity);
    }
    @Service
    public class TestServiceImpl implements TestService{
        
        @Resource
        private TestRepository testRepository;
    
        @Override
        public TestEntity save(TestEntity entity) {
            return testRepository.save(entity);
        }
    
    }

    服务端开放的RPC服务

    public interface WqqTestRpcService {
        
        TestEntity save(TestEntity entity);
    }
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    
    import com.wqq.test.TestEntity;
    import com.wqq.test.WqqTestRpcService;
    import com.wqq.test.TestService;
    import com.xxl.rpc.remoting.provider.annotation.XxlRpcService;
    @XxlRpcService
    @Service
    public class WqqTestRpcServiceImpl implements WqqTestRpcService{
        
        @Resource
        private TestService testService;
    
        @Override
        public TestEntity save(TestEntity entity) {
            return testService.save(entity);
        }
    
    }

    客户端使用

        @XxlRpcReference
        private WqqTestRpcService wqqTestRpcService;
        
        public void save() {
            TestEntity entity = new TestEntity();
            entity.setAge(23);
            entity.setName("我是谁");
            entity.setId(3);
            entity.setCreateTime(LocalDateTime.now());
            wqqTestRpcService.save(entity);
            
        }

    习惯写完之后测试

    测试TestService, WqqTestRpcService

    @ContextConfiguration(classes = TestServerApplication.class)
    @RunWith(SpringRunner.class)
    @SpringBootTest
    //@Transactional
    //@Rollback
    public class Test{
        
        @Resource
        private TestService testService;
        
        @Resource
        private WqqTestRpcService wqqTestRpcService;
        
        @Test
        public void test1() {
            TestEntity entity = new TestEntity();
            entity.setAge(23);
            entity.setName("测试1");
            entity.setId(1);
            entity.setCreateTime(LocalDateTime.now());
            wqqTestRpcService.save(entity);
        }
        @Test
        public void test2() {
            TestEntity entity = new TestEntity();
            entity.setAge(23);
            entity.setName("测试2");
            entity.setId(2);
            entity.setCreateTime(LocalDateTime.now());
            testService.save(entity);
        }
        
        
    }

    结果:数据库插入两条数据,说明方法是没有问题的

    正式运行。开始报错 Caused by: java.lang.StackOverflowError: null

    百思不得其解,查了网上很多基本都是说死循环或者是无线递归,可是我只是调用一个保存的方法,哪里来的死循环还有递归,还有说改变配置,但是我测试方法是行得通的,直觉告诉我不会说是改变配置(真的直觉,但是可能别人是有这样解决的,反正我没有试),后来又进行了很多次测试,结果完全想不到是参数类型的问题,把TestEntity的参数类型与LocalDateTime改成Date就可以,具体为啥这样,还没结论,只是知道这么不再报错,但是是不是真的最好的结局办法,依然不知, 希望有大神可以解惑吧

  • 相关阅读:
    关于谷歌、火狐 右键没有发送到onenote选项
    织梦CMS后台卡死的解决办法
    关于MS office 180天后再次激活遇到的问题解决方法
    IE浏览器中发送到onenote的选项没有调出来??
    解决apache服务器本地可以访问,同局域网内他人不能访问的问题(转)
    eclipse编辑器,怎么创建PHP和JAVA的工程项目?
    关于在VMware上装lFEDORA系统
    关于win7右下角显示“音频服务未运行”的解决方法
    关于装虚拟机遇到的若干问题
    关于无光盘无u盘状态下该如何安装系统
  • 原文地址:https://www.cnblogs.com/Cassie-wang/p/11169628.html
Copyright © 2020-2023  润新知