SOAPFaultException для RequestContext из SOAP в оценке IntelliJ - PullRequest
0 голосов
/ 26 ноября 2018

Во время отладки в IntelliJ я получаю SOAPFaultException после оценки выражения (или добавления наблюдения в консоли отладки) в объекте RequestContext.Более конкретно, ошибка говорит:

javax.xml.ws.soap.SOAPFaultException: Server did not recognize the value of HTTP Header SOAPAction: .

Почему это происходит?

1 Ответ

0 голосов
/ 26 ноября 2018

Эта ошибка возникает из-за пользовательской реализации Map класса RequestContext.java, сделанной в библиотеке jaxws-rt (версия 2.1.4).Реализация пользовательской карты имеет механизм Fallback, который, когда переменная "mapView.fallbackMap" имеет значение null, заголовок "soapAction" очищается в цикле forback.Проверьте фрагмент кода:

 /**
 * Fill a {@link Packet} with values of this {@link RequestContext}.
 */
public void fill(Packet packet) {
    if(mapView.fallbackMap==null) {
        if (endpointAddress != null)
            packet.endpointAddress = endpointAddress;
        packet.contentNegotiation = contentNegotiation;
        if (soapAction != null) {
            packet.soapAction = soapAction;
        }
        if(!others.isEmpty()) {
            packet.invocationProperties.putAll(others);
            //if it is not standard property it deafults to Scope.HANDLER
            packet.getHandlerScopePropertyNames(false).addAll(others.keySet());
        }
    } else {
        Set<String> handlerScopePropertyNames = new HashSet<String>();
        // fallback mode, simply copy map in a slow way
        for (Entry<String,Object> entry : mapView.fallbackMap.entrySet()) {
            String key = entry.getKey();
            if(packet.supports(key))
                packet.put(key,entry.getValue());
            else
                packet.invocationProperties.put(key,entry.getValue());

            //if it is not standard property it deafults to Scope.HANDLER
            if(!super.supports(key)) {
                handlerScopePropertyNames.add(key);
            }
        }

        if(!handlerScopePropertyNames.isEmpty())
            packet.getHandlerScopePropertyNames(false).addAll(handlerScopePropertyNames);
    }
}

Дополнительно, переменная "mapView.fallbackMap" заполняется каждый раз, когда создается метод из Map, не поддерживаемый пользовательской реализацией, например, размер "entrySet" или "size"метод.Поэтому каждый раз, когда мы вызываем операцию «Наблюдать» или «Оценивать» для отладки RequestContext в IntelliJ IDEA, запасной вариант заполняется без вызова SOAP.

Таким образом, решение не использует для отладки RequestContext перед вызовом SOAPили обязательно удалите следующее свойство перед выполнением запроса:

((BindingProvider) service).getRequestContext().remove("javax.xml.ws.soap.http.soapaction.uri")
...