castrs解组映射来自xml,spring-boot的内部类

时间:2018-03-16 09:08:45

标签: xml spring-boot mapping unmarshalling castor

我有一个xml文件,我使用castors unmarshalling映射到2个java类。它目前看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<Configurations>
    <Port>8007</Port>
    <EnableHttps>true</EnableHttps>
    <KeyStorePath>classpath:ssl-server.jks</KeyStorePath>
    <KeyPass>changeit</KeyPass>
    <TokenTtlMillis>15000</TokenTtlMillis>
  <Users>
    <Username>user1</Username>
    <Password>$2a$10$kIWaw2g1w0TC.RUtr1k3nu3PBZ9qtaLvAMhFmtbF2X8cwiXC9OXhS</Password> <!-- password -->
  </Users>
  <Users>
    <Username>user2</Username>
    <Password>$2a$10$jxGxonindJQgZjQoRxDhPewFjOo0F3ZoU8.VOFEOHTuMIJHRVTyF6</Password> <!-- password2 -->
  </Users>
</Configurations>

现在我想将<users>包裹在另一个<users>中,所以看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<Configurations>
  <Port>8007</Port>
  <EnableHttps>true</EnableHttps>
  <KeyStorePath>classpath:ssl-server.jks</KeyStorePath>
  <KeyPass>changeit</KeyPass>
  <TokenTtlMillis>15000</TokenTtlMillis>
  <Users>
    <User>
      <Username>user1</Username>
      <Password>$2a$10$kIWaw2g1w0TC.RUtr1k3nu3PBZ9qtaLvAMhFmtbF2X8cwiXC9OXhS</Password> <!-- password -->
    </User>
    <User>
      <Username>user2</Username>
      <Password>$2a$10$jxGxonindJQgZjQoRxDhPewFjOo0F3ZoU8.VOFEOHTuMIJHRVTyF6</Password> <!-- password2 -->
    </User>
  </Users>
</Configurations>

我如何在映射文件中执行此操作?目前看起来像这样,1个类有另一个类的列表

<mapping>
  <class name="com.cetrea.securityservice.bean.Configurations" auto-complete="true">
    <map-to xml="Configurations"/>
    <field name="port" type="int">
      <bind-xml name="Port" node="element"/>
    </field>
    <field name="enableHttps" type="boolean">
      <bind-xml name="EnableHttps" node="element"/>
    </field>
    <field name="keyStorePath" type="string">
      <bind-xml name="KeyStorePath" node="element"/>
    </field>
    <field name="keyPass" type="string">
      <bind-xml name="KeyPass" node="element"/>
    </field>
    <field name="TTL" type="int">
      <bind-xml name="TokenTtlMillis" node="element"/>
    </field>
    <field name="Users" collection="arraylist" type="com.cetrea.securityservice.bean.Users">
      <bind-xml name="Users"/>
    </field>
  </class>
  <class name="com.cetrea.securityservice.bean.Users" auto-complete="true">
    <map-to xml="Users"/>
    <field name="Username" type="string">
      <bind-xml name="Username" node="element"/>
    </field>
    <field name="Password" type="string">
      <bind-xml name="Password" node="element"/>
    </field>
  </class>
</mapping>

我认为我需要Configurations类,要有一个Users类的字段,然后Users类需要有一个用户列表。但我真的不知道如何实现它,以及在我的java模型类中要改变什么

1 个答案:

答案 0 :(得分:0)

我将<location="Users">添加到List下的映射文件中。这会创建一个包装器,不需要在模型类中

<mapping>
  <class name="com.cetrea.securityservice.bean.Configurations" auto-complete="true">
    <map-to xml="Configurations"/>
    <field name="port" type="int">
      <bind-xml name="Port" node="element"/>
    </field>
    <field name="enableHttps" type="boolean">
      <bind-xml name="EnableHttps" node="element"/>
    </field>
    <field name="keyStorePath" type="string">
      <bind-xml name="KeyStorePath" node="element"/>
    </field>
    <field name="keyPass" type="string">
      <bind-xml name="KeyPass" node="element"/>
    </field>
    <field name="TTL" type="int">
      <bind-xml name="TokenTtlMillis" node="element"/>
    </field>
    <field name="Users" collection="arraylist" type="com.cetrea.securityservice.bean.Users">
      <bind-xml name="User" location="Users"/>
    </field>
  </class>
  <class name="com.cetrea.securityservice.bean.Users" auto-complete="true">
    <map-to xml="User"/>
    <field name="Username" type="string">
      <bind-xml name="Username" node="element"/>
    </field>
    <field name="Password" type="string">
      <bind-xml name="Password" node="element"/>
    </field>
  </class>
</mapping>