Metro применяет политику во время выполнения либо из WSDL или конфигурационный файл WSIT-client.xml. Вот почему не генерируется код, связанный с политиками. В соответствии с this post на данный момент невозможно сделать программно.
This tutorial довольно хорошо объясняет некоторые вещи, которые вы можете сделать с WSS, и хотя все, вероятно, не применимо, в этом случае это все еще хорошее чтение.
Самый простой способ я нашел генерации клиента с поддержкой WSS является использование 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"));
}
И если вы хотите 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;
}