我正在尝试在mojo中使用字段上方的@Parameter
。
@Parameter(required = false)
public Map authentication;
在插件使用中,我正在传递:
<configuration>
<authentication>
<user>a</user>
<server>
<address>server.com</address>
<port>123</port>
</server>
<authentication>
</configuration>
行为是 maven 似乎无法注入所有数据,只是简单的<K,V>
,例如<user>
具有String
,但在<server>
的情况下,我期待相同的行为,例如,另一个具有<address>
和<port>
的Map<K,V>
,但 maven 注入null
您可能想查看映射复杂对象文档。
如果我理解正确,您想为"身份验证"配置一个设置,但其值是任意键值,其中值可能是一些复杂的对象"服务器",并将其"地址"和"端口"映射到正确的类型?
最好不要将其建模为 Map,而是使用一些对象来表示此结构
public final class Server {
private String address;
private Integer port;
// getters
}
public final class Authentication {
private String user;
private Server server;
// getters
}
public final class MyMojo extends AbstractMojo {
@Parameter
private Authentication authentication;
}
这允许您使用您提供的代码段配置。
如果我理解错误,并且您实际上想要一个java.util.Map<K, V>
,您可以在其中为身份验证提供任意值,那么您可能不走运。我想你可以让Authentication
类持有一张地图来做额外的事情:
public final class Authentication {
public String user;
public Server server;
public Map<String, String> other;
}
...
<properties>
<authentication>
<user>theUser</user>
<server>
<address>server.com</address>
<port>123</port>
</server>
<other>
<key1>value1</key1>
<key2>value2</key2>
</other>
</properties>
...
我个人的建议是采用显式建模您想要的结构的路线。这允许您让 Maven 插件环境为您进行尽可能多的检查。如果你拿一张任意的地图,那么你必须自己做各种各样的编组。
一个缺点是 Maven 没有为复杂对象提供一个很好的描述符,但无论如何你都不会有一个普通的地图。