her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人!
博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正。
这两天在学做项目,之前也学了spring、springmvc、springboot。那么现在就可以用springboot来做项目了,但是学的依然都只是皮毛,很多整合我都没有头绪,问题也很多。那么现在我就分享一下我在敲敲敲的时候遇到的掉头发问题。
这个问题真的是搞的我好头疼,终于成功解决。
我用的是Zookeeper注册中心,按照的是Apache官方给的maven坐标,可以参考下面的链接配置。
Annotation 配置 | Apache Dubbo
https://dubbo.apache.org/zh/docs3-v2/java-sdk/reference-manual/config/annotation/我跟官方里面的不一样,因为我导了dubbo-spring-boot-starter,代替了dubbo-bom。
下面是我在父工程中的依赖管理。
- <dependencyManagement>
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starterartifactId>
- <version>${spring-boot.version}version>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <version>${spring-boot.version}version>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- <version>${spring-boot.version}version>
- dependency>
-
- <dependency>
- <groupId>org.apache.dubbogroupId>
- <artifactId>dubbo-dependencies-zookeeperartifactId>
- <version>${dubbo.version}version>
- <type>pomtype>
- dependency>
- <dependency>
- <groupId>org.apache.dubbogroupId>
- <artifactId>dubbo-spring-boot-starterartifactId>
- <version>${dubbo.version}version>
- dependency>
-
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-boot-starterartifactId>
- <version>${mybatis-plus.version}version>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <version>${lombok.version}version>
- dependency>
-
-
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql.version}version>
- <scope>runtimescope>
- dependency>
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druid-spring-boot-starterartifactId>
- <version>${druid.version}version>
- dependency>
-
- dependencies>
- dependencyManagement>
我启动了两个dubbo服务,一个服务提供者provider和一个消费者consumer。
我在consumer的controller中这样写的(这段需要修改,不在这用IService的方法),
- LambdaQueryWrapper
queryWrapper= new LambdaQueryWrapper(); - queryWrapper.eq(Manager::getPhone,phone);
- managerService.selectOne(queryWrapper);
这个时候因为consumer用到了provider中的Service,而当前consumer和provider不在同一个服务,需要将wrapper序列化转至Service的服务,于是出现这个错误。
而网上查询得知:wrapper不支持也不推荐进行dubbo传递
所以,我们可以将这个写在一个服务里也就是provider,
改成在服务实现类impl中这样写,再在consumer中直接调用该Service的这个方法。
- LambdaQueryWrapper
queryWrapper= new LambdaQueryWrapper(); - queryWrapper.eq(Manager::getPhone,phone);
- managerDao.selectOne(queryWrapper);
问题就可以解决。
排除异常的话就要选择重要的信息进行观察,Failed to check the status of the service ,这里的意思就是这个Service接口创建失败,后面的异常信息非常重要:No provider available for the service ,意思就是对于service来说,没有可实现的provider,消费者在访问提供者的时候失败了。
我为什么会报这个错误呢,就是因为先启动了consumer的服务,服务提供者还没有,所以会失败,所以启动有个顺序,先启动provider再启动consumer。
Dubbo默认(缺省)会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true,如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时,会抛出异常,拿到null引用,如果check=false,总是会返回引用,当服务恢复时,能自动连上。

这是我在项目开发时写的一段关联映射查询。搞了一晚上,mybatis没有学的太深入,踩了很多坑,第一次用到,就总结一下。以后用的就方便了。
- <mapper namespace="com.ylm.dao.DeliveryOrderDao">
- <resultMap type="com.ylm.pojo.DeliveryOrder" id="baseResultMap">
- <id column="id" property="id"/>
- <result column="userId" property="userId"/>
- <result column="time" property="time"/>
- <result column="productInfo" property="productInfo"/>
- <result column="status" property="status"/>
- <result column="money" property="money"/>
- <result column="updateTime" property="updateTime"/>
- resultMap>
- <resultMap type="com.ylm.pojo.DeliveryOrder"
- id="findByIdResultMap"
- extends="baseResultMap">
- <collection property="user"
- ofType="com.ylm.pojo.User"
- column="{id=userId}"
- select="com.ylm.dao.UserDao.selectById">
- collection>
- resultMap>
- <select id="getAllDeliveryOrderAndUser" resultMap="findByIdResultMap">
- select id,user_id as userId,time,product_info as productInfo,status,money,update_time as updateTime from product_delivery
- select>
首先我们看一下重点collection的标签属性:
property: resultMap返回实体类中字段和result标签中的property一样
column: 数据库的列名或者列标签别名,是关联查询往下一个语句传送值。注意:在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。
javaType: 一般为ArrayList或是java.util.List,
ofType: java的实体类,对应数据库表的列名称,即关联查询select对应返回的类
select: 执行一个其他映射的sql语句返回一个java实体类型
①因为我的一个订单里只有一个User对象,而不是List,属性javaType不用配置。
②我的UserDao继承了MyBatisPlus提供的BaseMapper,select属性中的selectById方法是继承过来的,sql语句需要我们自己去想,因为要用到column传送值,可以想底层的selectById方法中语句中where 后面为 id = #{id} ,
则column="{id=userId}"中id对应selectById方法中的#{id}的参数名称,userId对应getAllDeliveryOrderAndUser方法中“user_id as userId”的别名userId,没有别名就是字段名。
③getAllDeliveryOrderAndUser中最好不写成select * from product_delivery,有可能会报错。
因为column传送值时,不知道字段名在哪。
④我开启了MybatisPlus配置全局的驼峰命名规则,sql中就用的数据库字段名,而不是实体的属性名,查询还是出现null,也不知道是什么情况,如果有报错那么写的sql语句就as成数据库中的字段名。