springboot捕获全局异常和配置多数据源

@


捕获全局异常是在项目运行期间如果调用的某一个方法出现了运行时异常,则会捕获,并且给出回馈。
首先需要建一个包,包里新建一个捕获异常类GlobalExceptionHandler。前提是springboot的启动类的扫描注解ComponentScan()要扫描到。

/**
 * 用于捕获全局异常
 */
@ControllerAdvice//控制器切面
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)//捕获运行时异常
    @ResponseBody
    public Map<String,Object> exceptionHandler(){//处理异常方法
        Map<String,Object> map=new HashMap<String, Object>();
        map.put("errorCode","101");
        map.put("errorMsg","系统错误!");
        return map;
    }
}

这个捕获异常类可以捕获到全局的运行时异常,例如商城购物车的控制层一个方法出现异常,黄色背景的是重点,会发生异常。

@RequestMapping("getShoppingCar")
    public String getShoppingCar(HttpSession session,Model model){
    Map<Integer,Cart> cartMap =(Map<Integer,Cart>)session.getAttribute("cartMap");
    model.addAttribute("carList",cartMap);
    int i=1/0;
    return "udai_shopcart";
}

然后启动项目,进入主页,当点击购物车按钮时也就是调用了getShoppingCar这个方法,发生了异常,运行结果是跳转页面失败,直接给出异常信息,也就是全局捕获异常类中设置的信息。
在这里插入图片描述

配置多数据源

以前是在applicationContext.xml中配置的,现在springboot通过注解来配置数据源。
首先在application.properties配置文件中加入多数据源配置。

spring.datasource.test1.url=jdbc:mysql://127.0.0.1:3306/test1?serverTimezone=UTC
spring.datasource.test1.username=root
spring.datasource.test1.password=1234
spring.datasource.test1.driverClassName=com.mysql.cj.jdbc.Driver

spring.datasource.test2.url=jdbc:mysql://127.0.0.1:3306/test2?serverTimezone=UTC
spring.datasource.test2.username=root
spring.datasource.test2.password=1234
spring.datasource.test2.driverClassName=com.mysql.cj.jdbc.Driver

在例子开始之前,首先去创建两个用于测试的数据库test1和test2,并且新建两张空表。

写两个数据源的配置类。

在java文件夹下新建dataSource包,新建数据源配置类DataSource01和DataSource02。

@Configuration//注解到springboot容器中
@MapperScan(basePackages="com.gyf.test1.mapper",sqlSessionFactoryRef="test1SqlSessionFactory")
public class DataSource01 {

    /**
     * @return 返回test1数据库的数据源
     */
    @Bean(name="test1DataSource")
    @Primary//主数据源,一个应用只能有一个主数据源
    @ConfigurationProperties(prefix="spring.datasource.test1")
    public DataSource dateSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * @return 返回test1数据库的会话工厂
     */
    @Bean(name = "test1SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("test1DataSource") DataSource ds) throws Exception{
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);

        return bean.getObject();
    }

    /**
     * @return 返回test1数据库的事务
     */
    @Bean(name = "test1TransactionManager")
    @Primary//主事务
    public DataSourceTransactionManager transactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * @return 返回test1数据库的会话模版
     */
    @Bean(name = "test1SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}
@Configuration//注解到springboot容器中
@MapperScan(basePackages="com.gyf.test2.mapper",sqlSessionFactoryRef="test2SqlSessionFactory")
public class DataSource02 {

    /**
     * @return 返回test2数据库的数据源
     */
    @Bean(name="test2DataSource")
    @ConfigurationProperties(prefix="spring.datasource.test2")
    public DataSource dateSource(){
        return DataSourceBuilder.create().build();
    }

    /**
     * @return 返回test2数据库的会话工厂
     */
    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("test2DataSource") DataSource ds) throws Exception{
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(ds);

        return bean.getObject();
    }

    /**
     * @return 返回test2数据库的事务
     */
    @Bean(name = "test2TransactionManager")
    public DataSourceTransactionManager transactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * @return 返回test2数据库的会话模版
     */
    @Bean(name = "test2SqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(
            @Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

在java文件夹下分别创建两个文件夹test1和test2,分别对这两个数据库进行操作,启动类都需要先扫描到test1和test2的包

@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.gyf.datasource","com.gyf.web","com.gyf.test1.service","com.gyf.test2.service"})
public class App 
{
    public static void main( String[] args )
    {
        //启动springboot项目
        SpringApplication.run(App.class,args);
    }
}

Test1的userMapper

public interface UserMapper {
    @Insert("insert user (username,password) values (#{username},#{password})")
    public int save(@Param("username") String username, @Param("password") String password);
}

Test1的UserServiceImpl

@Service
@Transactional
public class UserServiceImpl{
    @Autowired
    private UserMapper userMapper;
    public void register(String username, String password) {
        userMapper.save(username,password);
    }
}

Test2的CustomerMapper

public interface CustomerMapper {

   @Insert("insert customer (name,tel) values (#{name},#{tel})")
    public int save(@Param("name") String name, @Param("tel") String tel);
}

Test2的CustomerServiceImpl

@Service
@Transactional
public class CustomerServiceImpl {
    @Autowired
    private CustomerMapper customerMapper;
    public void save(String name, String tel) {
        customerMapper.save(name,tel);
    }
}

最后写一个controller类,调用这两个service

@RestController //声明Rest风格的控制器
//@EnableAutoConfiguration //自动配置,相当于写了spring的配置文件
@RequestMapping("user")
public class UserController {
    @Autowired
    private UserServiceImpl userService;
    @Autowired
    private CustomerServiceImpl customerService;
    @RequestMapping("register")
    @ResponseBody
    public String register(String username,String password){
        //把数据保存到test1数据库
        userService.register(username,password);
        //把数据保存到test2数据库
        customerService.save(username,"120");
        return "success";
    }
}

启动项目,看数据库表内容,两张表都插入了信息。

posted @ 2020-03-08 16:52  你樊不樊  阅读(538)  评论(1编辑  收藏  举报