如何注册'新元素?

时间:2016-07-10 13:14:34

标签: jaxb

我使用JAXB作为配置我的应用程序的简单方法,并在开始时对配置参数进行验证。这适用于大多数情况。 现在我想让我的配置变得更加灵活,并且想知道如何使用可互换的元素/对象:

示例(开发环境):

<email-gateway user="abc" pass="123456">
    <server-list>
        <server name="lorem"/>
        <server name="ipsum"/>
    </server-list>
</email-gateway>

示例(制作):

<email-gateway user="abc" pass="123456">
    <dns-lookup name="gateway.server" type="MX" />
</email-gateway>

示例(扩展生产):

<email-gateway user="abc" pass="123456">
    <round-robin>
        <dns-lookup name="gateway.server" type="MX" />
    </round-robin>
</email-gateway>

Java代码(简化):

public class EmailGateway {
    @XmlAttribute(name="user")
    private String _user;

    @XmlAttribute(name="pass")
    private String _pass;

    @XmlElement(name="server-list")
    private ServerList _serverList;

    boolean sendMail(String to, String subject, String body) {
        for (Server server : _serverList.servers()) {
            if( server.sendMail(_user, _pass, to, subject, body) ) {
                return true;
            }
        }

        return false;
    }
}

我们的想法是为开发环境设置一个简单(固定)的设置,同时生产需要一些灵活性。由于服务器列表可以更改,因此应自动退出。 第二种方法更好。 <round-robin>每次都会负责从列表中返回不同的服务器,以避免过度使用相同的(主要是第一个)服务器。

由于EmailGateway类不需要知道ServerList的实现,我想通过仅更改配置XML来使其更灵活。否则,当我使用不同的算法来检索服务器列表时(例如,Web服务或类似JNDI查找......),我将不得不使用ServerList更改所有类。

这可能吗?

1 个答案:

答案 0 :(得分:0)

由于我没有找到针对此用例的直接解决方案,因此我通过仅引入一个新元素作为其余部分的委托,简化了间接问题。

现在只有<server-list>元素必须知道不同的实现。

结果如下:

<email-gateway user="abc" pass="123456">
    <server-list>
        <string-list>
            <server name="lorem"/>
            <server name="ipsum"/>
        </string-list>
    </server-list>
</email-gateway>

<email-gateway user="abc" pass="123456">
    <server-list>
        <dns-lookup name="gateway.server" type="MX" />
    </server-list>
</email-gateway>

<email-gateway user="abc" pass="123456">
    <server-list>
        <round-robin>
            <dns-lookup name="gateway.server" type="MX" />
        </round-robin>
    </server-list>
</email-gateway>