设为首页 加入收藏

TOP

quarkus实战之七:使用配置(一)
2023-08-06 07:50:00 】 浏览:95
Tags:quarkus

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《quarkus实战》系列的第七篇,前文讲述了如何在将配置信息传入quarkus应用,今天要练习的是如何使用这些配置信息
  • 整篇文章由以下内容构成:
  1. 创建工程,作为演示使用配置项操作的代码
  2. 演示最基本的使用配置项操作
  3. 展示配置项不存时会导致什么问题
  4. 演示如何设置默认值,这样配置项不存在也不会出错
  5. 默认值是字符串,而实际的变量可以是多种类型,它们之间的关系
  6. Optional类型的配置注入
  7. 不用注解注入,也可以写代码获取配置
  8. 针对相同前缀的配置项,使用配置接口简化代码
  9. 使用配置接口嵌套,简化多级的相同前缀配置项
  10. 用map接受配置信息(减少配置项相关代码量)
  11. quarkus及其扩展组件的内置配置项
  • 接下来从创建demo工程开始吧

演示代码

  • 创建一个demo工程,参考下面的命令,这样的工程会自带一个web服务类HobbyResource.java
mvn "io.quarkus:quarkus-maven-plugin:create" \
  -DprojectGroupId="com.bolingcavalry" \
  -DprojectArtifactId="hello-quarkus" \
  -DprojectVersion="1.0-SNAPSHOT" \
  -DclassName="HobbyResource" \
  -Dpath="actions"

最基本的配置

  • 先来看看最常用最基本的配置文件使用方式
  • 打开文件src/main/resources/application.properties,增加下面这行配置
greeting.message = hello from application.properties
  • 打开HobbyResource.java,增加如下成员变量,使用了注解ConfigProperty
  @ConfigProperty(name = "greeting.message") 
  String message;
  • 以上就是最简单的使用配置项的方式,程序运行后,application.properties中greeting.message的值就会被quarkus框架注入到message成员变量中

配置项不存在导致的异常

  • 如果ConfigProperty注解的配置项在配置文件中不存在,应用启动会报错,来看看是什么错误
  • 将HobbyResource.java的代码改成下面这样,成员变量notExistsConfig的配置项是not.exists.config,这个配置项在配置文件中并不存在
@Path("/actions")
public class HobbyResource {

    // 配置文件中不存在名为not.exists.config的配置项
    @ConfigProperty(name = "not.exists.config")
    String notExistsConfig;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello RESTEasy, " + LocalDateTime.now() + ", [" + notExistsConfig + "]";
    }
}
  • 启动应用时报错如下图所示,红框中提示加载配置项失败
    image-20220306112030133

带默认值的配置

  • 对于上面演示的配置项不存在导致启动失败问题,可以给ConfigProperty注解设置默认值,这样一旦找不到配置项,就使用默认值注入,可以避免启动失败了
  • HobbyResource.java的源码如下,成员变量notExistsConfig的注解了增加属性defaultValue
@Path("/actions")
public class HobbyResource {

    // 配置文件中不存在名为not.exists.config的配置项
    @ConfigProperty(name = "not.exists.config", defaultValue = "112233")
    String notExistsConfig;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello RESTEasy, " + LocalDateTime.now() + ", [" + notExistsConfig + "]";
    }
}
  • 再次启动应用,这次不报错了,浏览器访问结果如下图,defaultValue已经生效
    在这里插入图片描述

defaultValue属性的自动转换

  • 对于ConfigProperty注解的defaultValue属性还有一点要注意,来看ConfigProperty的源码,如下图,红框显示defaultValue的类型是String
    在这里插入图片描述
  • 上图中,defaultValue的注释有说明:如果ConfigProperty注解修饰的变量并非String型,那么defaultValue的字符串就会被自动quarkus字符转换
  • 例如修饰的变量是int型,那么defaultValue的String类型的值会被转为int型再赋给变量,如下所示,notExistsConfig是int型,defaultValue的字符串可以被转为int:
// 配置文件中不存在名为not.exists.config的配置项
@ConfigProperty(name = "not.exists.config", defaultValue = "123")
int notExistsConfig;
  • 如果把上面代码中的defaultValue的值从123改为xxx,此时应用启动就会失败,因为“xxx”转为int的过程中抛出了异常,如下图:
    在这里插入图片描述
  • 除了上面试过的int,还有很多种类型都支持从defaultValue的字符串值被自动转换,它们是:
  1. 基础类型:如boolean, byte, short
  2. 装箱类型:如java.lang.Boolean, java.lang.Byte, java.lang.Short
  3. Optional类型:java.util.Optional, java.util.OptionalInt, java.util.OptionalLong, and java.util.OptionalDouble
  4. java枚举
  5. java.time.Duration
  6. JDK网络对象:如java.net.SocketAddress, java.net.InetAddress
  • 例如,下面是字符串自动转InetAddress的例子,可以正常运行:
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JDBC p3 事务 下一篇3、Spring之入门案例

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目