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;
}