Metro 在运行时从 WSDL 或 wsit-client.xml 配置文件应用策略。这就是为什么没有生成与策略相关的代码的原因。根据这篇文章,目前不可能以编程方式进行。
本教程很好地解释了您可以使用 WSS 执行的一些操作,尽管所有内容可能不适用于这种情况,但它仍然是一本不错的读物。
我发现生成支持 WSS 的客户端的最简单方法是使用wsimport
Metro 中的脚本:
cd metro/bin/
mkdir src target
./wsimport.sh -s src -d target -extension -Xendorsed -verbose YourService.wsdl
然后将 Metro 安装到您的应用程序服务器中(将库复制到正确的位置或运行 ant 脚本):
ant -f metro-on-glassfish.xml
然后将您的本地 WSDL 文件放入您的类路径(例如您的资源文件夹)中,以便 Metro 可以在运行时获取它以应用您生成的YourService
类中的策略:
private final static URL YOURSERVICE_WSDL_LOCATION;
// This is enough, you don't need the wsdlLocation attribute
// on the @WebServiceClient annotation if you have this.
static {
YOURSERVICE_WSDL_LOCATION =
CustomerService.class.getClassLoader().getResource("YourService.wsdl");
}
public YourService() {
super(YOURSERVICE_WSDL_LOCATION,
new QName("http://tempuri.org/", "YourService"));
}
如果您想要WS-Addressing,您可能需要手动将该功能添加到您的绑定方法中(Metro 从来没有为我生成它,所以我总是必须自己添加它)。
@WebEndpoint(name = "WSHttpBinding_IYourService")
public IYourService getWSHttpBindingIYourService() {
WebServiceFeature wsAddressing = new AddressingFeature(true);
IYourService service =
super.getPort(new QName("http://xmlns.example.com/services/Your",
"WSHttpBinding_IYourService"), IYourService.class,
wsAddressing);
return service;
}