2

Я пытаюсь разработать автономное клиентское приложение, которое использует веб-службы в контейнере Glassfish (Metro). Все, что мне нужно для работы, это wsdl для wervices, которые я пытаюсь использовать. Wsdl изобилует всеми тэгами wsp: Policy. Похоже, что IssuedToken, Trust13, ecryption используются. Итак, я создал код из netbeans и JAX-WS. Все шло хорошо, но при попытке запуска клиента я получаю: «WST0029: STS места не может быть получен либо из IssuedToken или от конфигурации клиента для доступа к услуге http://localhost:8080/ ....»Как мне работать с WS-Security, когда у меня есть wsdl?

Вот когда это произошло в что я ничего не знаю о WSS. Не похоже, чтобы какой-либо код был создан для защиты. Поэтому мне придется идти с нуля. С чего начать? Книги? Учебники?

ТИА

ответ

2

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