ssm项目改造为springboot+dubbo流程&注意点&报错处理思路 - Go语言中文社区

ssm项目改造为springboot+dubbo流程&注意点&报错处理思路


虚拟机Ubuntu上运行的容器:

一、父级maven(基础maven)

1.新建普通maven项目作为父级maven模块
src删掉
2.添加子模块(依旧是普通maven项目)

注意:
直接从根路径开始导,避免后面改路径的麻烦。
用的是springboot的依赖,不能直接把ssm的依赖全放进来,看什么报错导什么依赖。

3.mapper里面引入的没有写全类限定名,需要起别名。
在provider的application.properties添加

#起别名 对应父级maven中mapper.xml的resultType
mybatis.type-aliases-package: com.kgc.model
#对应的mapper.xml是这样的
<select id="getById" resultType="ItripAreaDic">
XXXXXX
</select>

4.不能放jedis依赖,不能引jedis构建的redisUtils。导入如下redis依赖,降项目的版本为1.5.9。因为1.5.9才支持该redis依赖。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

相应的redisUtils类应使用RedisTemplate去编写:

package com.kgc.utils;

@Component
public class RedisUtil {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedisTemplate<Object, Object> redisTemplate;

    @Resource(name = "stringRedisTemplate")
    ValueOperations<String, String> valOpsStr;

    @Resource(name = "redisTemplate")
    ValueOperations<Object, Object> valOpsObj;

    /**
     * 根据指定key获取String
     *
     * @param key
     * @return
     */
    public String getStr(String key) {
        return valOpsStr.get(key);
    }

    /**
     * 设置Str缓存    public boolean set(String key, String value)
     *
     * @param key
     * @param val
     */
    public void setStr(String key, String val) {
        valOpsStr.set(key, val);
    }

    /***
     * 设置Str缓存   public boolean set(String key, int seconds, String value)
     * @param key
     * @param val
     * @param expire 超时时间
     */
    public void setStr(String key, String val, Long expire) {
        valOpsStr.set(key, val, expire, TimeUnit.MINUTES);
    }

    /**
     * 删除指定key
     *
     * @param key
     */
    public void del(String key) {
        stringRedisTemplate.delete(key);
    }

    /**
     * 根据指定o获取Object
     *
     * @param o
     * @return
     */
    public Object getObj(Object o) {
        return valOpsObj.get(o);
    }

    /**
     * 设置obj缓存
     *
     * @param o1
     * @param o2
     */
    public void setObj(Object o1, Object o2) {
        valOpsObj.set(o1, o2);
    }

    /**
     * 删除Obj缓存
     *
     * @param o
     */
    public void delObj(Object o) {
        redisTemplate.delete(o);
    }

    /***
     * 加锁的方法
     * @return
     */
    public boolean lock(String key, Long expire) {
        RedisConnection redisConnection = redisTemplate.getConnectionFactory().getConnection();
        //设置序列化方法
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        if (redisConnection.setNX(key.getBytes(), new byte[]{1})) {
            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
            redisConnection.close();
            return true;
        } else {
            redisConnection.close();
            return false;
        }
    }

    /***
     * 解锁的方法
     * @param key
     */
    public void unLock(String key) {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.delete(key);
    }
    
   //(改造爱旅行时新加的方法)key是否存在
    public boolean exist(String key) {
        //这样获取不到 还要序列化一下
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate.hasKey(key);
    }

    //(改造爱旅行时新加的方法)根据key获取过期时间
    public Long getTime(String key){
        stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
        return stringRedisTemplate.getExpire(key);
    }

}

5.mapper.xml的namespace注意对应父级Maven中dao模块的路径

<mapper namespace="com.kgc.mapper.ItripAreaDicMapper">
XXXXXX
</mapper>

6.注意添加mapper.xml的扫描配置

#检查基础模块(父级shop-common中的dao模块,resources中包名为mapper)
mybatis.mapper-locations=classpath:mapper/*.xml

7.itrip-common-dao子模块中的类要添加@Mapper注解

import org.apache.ibatis.annotations.Mapper;

8.itrip-common-dto中包括dto,exception,vo这些的类都不需要添加注解。
但是要注意,当mapper.xml中用到vo类时,要写全限定类名。
9.itrip-common-model实体模块中的类要实现序列化,否则无法执行dubbo服务。
注意要在配置文件中配置别名,详情查看第3条。

public class ItripAreaDic implements Serializable {}

10.itrip-common-service中放的增删改查分页的接口,不写注解。
11.itrip-common-utils中放common(如:Constants)、config、utils,common和utils不写注解。

config配置类要写注解,还要在用到所在接口的consumer项目的application.properties中进行配置。

@Component
@ConfigurationProperties(prefix = "systemConfig")
public class SystemConfig {}

二、provider提供者服务项目

基础模块创建完毕,install成功后。创建springboot项目(选为web)provider
1.降版本为1.5.9
2.pom导依赖dubbo、zk、fastjson
3.启动类加注解@EnableDubboConfiguration
4.写配置文件application.properties
最基本的要配置dubbo、dataSource、redis。

5.建立实现类service.impl
service的包路径要和父级Maven模块的包路径保持一致,否则扫描不到,如下:

注意:
业务不要放provider里,只放增删改查和分页,这些代码生成器生成的内容。

运行provider成功后,登录dubbo检查服务,应用中是否有provider,服务中检查impl,是否有注册到注册中心。

6.service.impl中的类添加注解:

@Component
@Service(interfaceClass = ItripAreaDicService.class)
//@Service("itripAreaDicService")
public class ItripAreaDicServiceImpl implements ItripAreaDicService {

    @Resource
    private ItripAreaDicMapper itripAreaDicMapper;

    public ItripAreaDic getById(Long id)throws Exception{
        return itripAreaDicMapper.getById(id);
    }
 }

注解@Component、@Service、@Resource分别引用自:

import org.springframework.stereotype.Component;
import com.alibaba.dubbo.config.annotation.Service;
import javax.annotation.Resource;

三、consumer消费者服务项目

创建springboot项目(选为web)auth-consumer
1.降版本为1.5.9
2.pom导依赖dubbo、zk、fastjson
3.启动类加注解
4.写配置文件application.properties
consumer中不要dao依赖
5.建controller、service.impl
业务impl命令为LocalXXXXXX

引入提供者服务的service接口使用注解@Reference,引入父级maven模块的service类使用注解@Resource或@Autowired,引入本consumer项目中的service接口使用@Resource。

注意:如果consumer中没有用到@Reference这个注解,该consumer项目是不会注册到dubbo容器中的。

四、报错解决思路

1.报错ibatis方法异常,检查dao方法和mapper.xml对应的方法名是否一致。

2.ibatis dao 报错解决:
namespace
mapper注解
mapper包扫描

3.全部都检查完毕确定没有问题,但是仍然报错包找不到的空指针异常。
就到maven本地库,找到打包出的文件,打开检查本地写的项目和打包出来的项目是否一致,发现不一致,就删掉maven库,clean清掉target,重新install。

4.报错Cannot determine embedded database driver class for database type NONE。

解决思路:
itrip-auth-consumer里面不能导itrip-common-dao的依赖
启动类加了@EnableDubboConfiguration 的注解
上述2种都没问题,启动类添加配置:

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})


依旧报错,检查父级maven模块中,有关于solr的3个类放到了itrip-common-utils子模块,由于itrip-auth-consumer项目导入了itrip-common-utils依赖,所以需要在该项目中配solr,尽管该项目没有接口用到solr。
所以建议把solr单独放到一个子模块中,需要时引入依赖并在相应的项目配置。

//Searchdb类位于父级maven项目的itrip-common-utils子模块中
package com.kgc.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "searchdb")
public class Searchdb {
    private String baseUrl;

    public String getBaseUrl() {
        return baseUrl;
    }

    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }
}

application.properties中solr的配置
# solr配置
# 配置solr核心
searchdb.baseUrl=http://localhost:8080/solr/hotel
# 配置solr网址
spring.data.solr.host=http://localhost:8080/solr

solr的依赖用这个

 <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-solr</artifactId>
            <version>2.1.1.RELEASE</version>
</dependency>
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_45899013/article/details/107201790
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢