• 组件编码 hzero-starter-core

    一、简介

    1.1 概述

    该组件主要针对技术开发中进行技术支持,提供一些通用的技术开发支持功能,减少重复造轮子。定义了基础实现类,异常封装,常用工具等。

    1.2 组件坐标

    <dependency>
         <groupId>org.hzero.starter</groupId>
        <artifactId>hzero-starter-core</artifactId>
        <version>${hzero.starter.version}</version>
    </dependency>
    

    二、组件功能

    2.1 base

    base 包主要定义了一些基础常量、BaseController 等。

    2.2 exception

    exception 包提供了基础的异常类,以及全局异常处理器:

    /**
     * 通用异常类的使用
     *
     * 通用异常类主要有 {@link CommonException}、受检异常 {@link CheckedException}、非法操作异常 {@link IllegalOperationException} <br>
     *
     * 抛出异常时,通常需在 messages_zh_CN.properties/messages_en_US.properties 定义多语言消息,抛出异常时指定对应的编码 <br>
     *
     * 定义消息编码时,一般分三段,格式为 服务简码.类型(info/warn/error).消息编码,如:demo.warn.emailNotBlank <br>
     */
    public void commonException() throws CheckedException {
    
        String email = "";
    
        // CommonException:RuntimeException 的子类,一般用于封装程序中的业务异常
        if (StringUtils.isBlank(email)) {
            throw new CommonException("demo.warn.emailNotBlank");
        }
    
        try {
            // do ...
        } catch (Exception e) {
            throw new CommonException("demo.error.createUserError", e);
        }
    
        // CheckedException: Exception 的子类,一般用于封装高级别的错误,需上级调用者处理
        try {
            // do...
        } catch (RuntimeException e) {
            throw new CheckedException("demo.error.checkedException");
        }
    
    }
    

    2.3 util

    util 包提供了一些常用的扩展的工具类:

    PinyinUtils

    public void demo() {
        String text1 = "菜单管理"; // 有多音字
        String text2 = "用户管理"; // 无多音字
    
        String pinyin1 = PinyinUtils.getPinyin(text1);
        String capital1 = PinyinUtils.getPinyinCapital(text1);
        // 获取中文的拼音,结果:|caidanguanli|caishanguanli|caichanguanli|
        System.out.println("pinyin1 >> " + pinyin1);
        // 获取拼音首字母,结果:|ccgl|csgl|cdgl|
        System.out.println("capital1 >> " + capital1);
    
    
        String pinyin2 = PinyinUtils.getPinyin(text2);
        String capital2 = PinyinUtils.getPinyinCapital(text2);
        // 结果:|yonghuguanli|
        System.out.println("pinyin2 >> " + pinyin2);
        // 结果:|yhgl|
        System.out.println("capital2 >> " + capital2);
    }
    

    Regexs

    public void demo() {
        // 正则表达式
        String integer = Regexs.INTEGER; // 整数
        String email = Regexs.EMAIL; // 邮件
        String url = Regexs.URL; // URL
        String chinese = Regexs.CHINESE; // 中文
        // .......
    
        // 正则匹配方法
        // 判断是否是手机号
        boolean isPhone = Regexs.is("185666444", Regexs.MOBILE);
        // 判断是否是中文
        boolean isChinese = Regexs.is("是否中文", Regexs.CHINESE);
        // 判断是否是数字
        boolean isNumber = Regexs.isNumber("12345");
        // 判断是否是邮箱
        boolean isEmail = Regexs.isEmail("hzero@hand-china.com");
        // 判断是否是IP地址
        boolean isIp = Regexs.isIP("192.168.12.101");
        // 判断是否是URL地址
        boolean isUrl = Regexs.isUrl("www.baidu.com");
        // 判断是否是移动手机号
        boolean isMobile = Regexs.isMobile("18523226666", "+86");
    
    }
    

    ResponseUtils

    public class ResponseUtilsDemo {
    
        private UserFeignClient userFeignClient;
    
        public void demo() {
    
            UserDTO dto = new UserDTO();
            dto.setEmail("demo@hand-china.com");
    
            // Feign 调用创建用户
            ResponseEntity<String> result = userFeignClient.createUser(dto);
    
            // 处理方式一:判断结果处理
            if (ResponseUtils.isFailed(result)) {
                // 获取异常信息
                ExceptionResponse response = ResponseUtils.getResponse(result, ExceptionResponse.class);
                throw new CommonException(response.getMessage());
            }
            // 成功,获取返回用户信息
            UserDTO user1 = ResponseUtils.getResponse(result, UserDTO.class);
    
    
            // 处理方式二,基于 lambada 表达式处理
            // 第三个参数:非2xx错误处理;第四个参数:200,但是failed=true处理
            UserDTO user2 = ResponseUtils.getResponse(result, UserDTO.class, (httpStatus, response) -> {
                throw new CommonException(response);
            }, (exceptionResponse) -> {
                throw new CommonException(exceptionResponse.getMessage());
            });
    
        }
    
    
        @FeignClient(value = HZeroService.Iam.NAME)
        public interface UserFeignClient {
    
            @PostMapping("/v1/users")
            ResponseEntity<String> createUser(UserDTO user);
        }
    
        public class UserDTO {
            private Long id;
            private String email;
    
            // getter/setter
        }
    }
    

    2.4 captcha

    captcha 下提供了基础的验证码功能封装。

    2.5 message

    message 包提供国际化消息相关的操作。

    /**
     * 添加资源文件位置
     *
     * @param names 如 <code>classpath:messages/messages_core</code>
     */
    public static void addBasenames(String... names)
    
    public static Message getMessage(String code, String defaultMessage)
    
    public static Message getMessage(String code, String defaultMessage, Locale locale)
    
    public static Message getMessage(String code, Object[] args, String defaultMessage)
    
    public static Message getMessage(String code, Object[] args, String defaultMessage, Locale locale)
    
    public static Message getMessage(String code)
    
    public static Message getMessage(String code, Locale locale)
    
    public static Message getMessage(String code, Object[] args)
    
    public static Message getMessage(String code, Object[] args, Locale locale)
    
    public static Message getMessageLocal(String code)
    
    public static Message getMessageLocal(String code, Locale locale)
    
    public static Message getMessageLocal(String code, Object[] args)
    
    public static Message getMessageLocal(String code, Object[] args, Locale locale)
    
    
    
    public void getMessage() {
    
        // 获取消息:demo.warn.emailNotBlank=邮箱不能为空
        String msg1 = MessageAccessor.getMessage("demo.warn.emailNotBlank").getDesc();
    
        // 获取带参数的消息:demo.warn.usernameLengthError=用户名长度在{0}-{1}
        String msg2 = MessageAccessor.getMessage("demo.warn.usernameLengthError", new Object[]{6, 30}).getDesc();
    
        // 指定默认消息,没有则使用默认消息
        String msg3 = MessageAccessor.getMessage("demo.warn.emailNotBlank", "Email is blank.").getDesc();
    
        // 指定消息的语言
        String msg4 = MessageAccessor.getMessage("demo.warn.emailNotBlank", LanguageHelper.locale()).getDesc();
    }
    

    2.6 algorithm

    常用算法工具。

    tree(递归构建树)

    class Entity extentds org.hzero.core.algorithm.tree.Child<Entity> {
        Integer id;
        Integer parentId;
        // other field ...
        // getter and setter ...
    }
    
    // method
    List<Entity> objList = // from anywhere...
    List<Entity> result = org.hzero.core.algorithm.tree.TreeBuilder.buildTree(objList, null, Entity::getId, Entity::getParentId)
    
    [                                                   [
        {                                                   {
            "id":1,                                             "id":1,
            "parentId":null,                                    "parentId":null,
            ...                                                 "children":[{
        },{                                                         "id":2,
            "id":2,                                                 "parentId":1,
            "parentId":1,               ->                          ...
            ...                                                 },{
        },{                                                         "id":3,
            "id":3,                                                 "parentId":1,
            "parentId":1,                                           ...
            ...                                                 }]
        }                                                       ...
        ...                                                 }
    ]                                                   ]
    

    structure(自定义数据结构)

    2.7 jackson

    封装了一些jackson序列化和反序列化的操作,支持Java8时间格式的序列化,使用前需要在Spring Boot启动类上添加org.hzero.core.jackson.annotation.EnableObjectMapper注解。

    忽略时区转换

    字符串两端空格过滤

    敏感信息加密

    2.8 convert

    封装了一些自定义的参数转换,可以通过hzero.date.converter.enable配置关闭或者开启这些转换器,默认开启。

    Date

    LocalDate

    三、版本更新日志

    0.8.0.RELEASE [2019-3-29]