我使用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
更改所有类。
这可能吗?
答案 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>