我正在尝试开发一个在Glassfish容器(Metro)中使用Web服务的独立客户端应用程序。关于我必须工作的所有东西都是我想要使用的wervices的wsdl。 wsdl充斥着各种'wsp:Policy'标签。看起来像IssuedToken,Trust13,ecryption都被使用了。 所以我从netbeans和JAX-WS生成了一些代码。一切顺利,但在尝试运行客户端时,我得到: 'WST0029:无法从IssuedToken或客户端配置获取STS位置以访问服务http://localhost:8080/ ....'
当我发现我对WSS一无所知时。它看起来不像生成任何代码来处理安全性。所以,我必须从头开始。 那么从哪里开始呢?图书?教程?
TIA
答案 0 :(得分:2)
Metro在运行时从WSDL或wsit-client.xml配置文件应用策略。这就是为什么没有生成与策略相关的代码的原因。根据{{3}},目前不可能以编程方式进行。
this post很好地解释了你可以用WSS做的一些事情,尽管在这种情况下一切都可能不适用,但它仍然是一个很好的阅读。
我发现生成具有WSS支持的客户端的最简单方法是使用Metro的wsimport
脚本:
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"));
}
如果你想要This tutorial,你可能需要手动为你的绑定方法添加这个功能(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;
}