首页 > 解决方案 > 如何在 OpenLiberty 的 server.xml 配置属性文字/变量中使用自定义转换器?

问题描述

我真的很想将容器管理的事务与 JPA 一起使用,因此将采用简单的方法在 server.xml 中创建数据源,然后在我的代码中使用 @PersistenceContext。

我目前面临的问题——也许我想得太复杂了——是我在运行时在我的 Cloud Foundry 环境中获取凭据作为 VCAP_SERVICES 系统环境变量。

这个 VCAP_SERVICES 变量包含一个带有必要凭据的大 JSON。因此,我首先必须在其中提取相应的 JSON,然后将其作为属性传递。

我最初的想法是在这种情况下使用转换器从 JSON 中返回值,以便可以使用它们。但似乎这在定义的配置 xml 文件中是不可能的。

我肯定要防止的是“注入”我自己做的事情,比如拥有一个属性文件并从不同的环境 DEV、TEST、PROD 复制值,因为 Cloud Foundry 环境已经在为我做这项工作.

所以问题是:如何将 VCAP_SERVICES 系统环境变量中的凭据获取到 server.xml 配置中?请记住:我真的必须解析 VCAP_SERVICES 变量,因为这是 JSON 并提取值。

<?xml version="1.0" encoding="UTF-8"?>
<server description="Config example">

    <featureManager>
        <feature>javaee-8.0</feature>
        <feature>mpMetrics-1.1</feature>
        <feature>monitor-1.0</feature>
    </featureManager>

    <!-- Postgres config-example-db definition -->
    <dataSource id="DefaultDataSource" jndiName="jdbc/config-example" jdbcDriverRef="postgresql-driver"
                type="javax.sql.ConnectionPoolDataSource" transactional="true">

        <properties serverName="config-example-db" portNumber="5432"
                    databaseName="postgres"
                    user="${config-example.db.username}"
                    password="${config-example.db.password}"/>

    </dataSource>

    <basicRegistry id="basic" realm="MicroProfileMetrics">
        <user name="admin" password="adminadmin"/>
        <user name="nonadmin" password="guest"/>
    </basicRegistry>

    <administrator-role>
        <user>admin</user>
    </administrator-role>

</server>

标签: javaibm-cloudcloud-foundryopen-libertymicroprofile

解决方案


对于许多服务,liberty buildpack 将自动配置 server.xml。
postgresql 就是其中之一。请参阅: https ://github.com/cloudfoundry/ibm-websphere-liberty-buildpack/blob/master/docs/services/postgresql.md

此外,对于许多服务,buildpack 将创建应用程序可以访问的环境变量。

例如,将 cloudantNoSQL 服务绑定到应用程序会在 VCAP_SERVICES 中生成以下凭据:

{
    "binding_name": null,
    "credentials": {
     "apikey": "<apikey>",
     "host": "<host>-bluemix.cloudantnosqldb.test.appdomain.cloud",
     "iam_apikey_description": "Auto-generated for binding <host>",
     "iam_apikey_name": "Cloudant-sd",
     "iam_role_crn": "crn:v1:bluemix:public:iam::::serviceRole:Writer",
     "iam_serviceid_crn": "crn:v1:staging:public:iam-identity::<id>::serviceid:ServiceId-<serviceid>",
     "url": "https://<host>-bluemix.cloudantnosqldb.test.appdomain.cloud",
     "username": "<username>-bluemix"
    },

然后 buildpack 将在 runtime-vars.xml 中创建变量:

 <variable name='cloud.services.Cloudant-sd.label' value='cloudantNoSQLDB'/>
  <variable name='cloud.services.Cloudant-sd.plan' value='Lite'/>
  <variable name='cloud.services.Cloudant-sd.name' value='Cloudant-sd'/>
  <variable name='cloud.services.Cloudant-sd.instance_name' value='Cloudant-sd'/>
  <variable name='cloud.services.Cloudant-sd.connection.apikey' value='<apikey'/>
  <variable name='cloud.services.Cloudant-sd.connection.host' value='<host>-bluemix.cloudantnosqldb.test.appdomain.cloud'/>
  <variable name='cloud.services.Cloudant-sd.connection.iam_apikey_description' value='Auto-generated for binding <host>'/>
  <variable name='cloud.services.Cloudant-sd.connection.iam_apikey_name' value='Cloudant-sd'/>
  <variable name='cloud.services.Cloudant-sd.connection.iam_role_crn' value='crn:v1:bluemix:public:iam::::serviceRole:Writer'/>
  <variable name='cloud.services.Cloudant-sd.connection.iam_serviceid_crn' value='crn:v1:staging:public:iam-identity::<id>::serviceid:ServiceId-<serviceid'/>
  <variable name='cloud.services.Cloudant-sd.connection.url' value='https://<host>-bluemix.cloudantnosqldb.test.appdomain.cloud'/>
  <variable name='cloud.services.Cloudant-sd.connection.username' value='<username>-bluemix'/>

请参阅https://cloud.ibm.com/docs/runtimes/liberty?topic=liberty-options_for_pushing#accessing_info_of_bound_services


推荐阅读