Ошибка JVM? java.lang.VerifyError: неверный тип в стеке операндов

С помощью org.apache.wss4j Артефакты для поддержки ws-security части вызова службы SOAP внутри приложения Play Framework (версия Java) привели к этому беспорядку:

java.util.concurrent.CompletionException: java.lang.RuntimeException: java.lang.VerifyError: Неверный тип в стеке операндов Сведения об исключении: расположение:
    org/apache/cxf/ws/security/wss4j/policyvalidators/AbstractSupportingTokenPolicyidrysededololidjoledSolE util/List;Ljava/util/List;Ljava/util/List;Lorg/apache/cxf/message/Message;)Z @28: invokespecial Причина: Введите 'org/apache/wss4j/policy/model/EncryptedParts' (текущий фрейм, стек [1]) нельзя назначить текущему фрейму 'org/apache/wss4j/policy/model/SignedParts':
    bci: @28
    flags: { }
    locals: { 'org/apache/cxf/ws/security/wss4j/policyvalidators/AbstractSupportingTokenPolicyValidator', 'java/util/List', 'java/util/List', 'java/util/List', ' стек org/apache/cxf/message/Message' }: { 'org/apache/cxf/ws/security/wss4j/policyvalidators/AbstractSupportingTokenPolicyValidator', 'org/apache/wss4j/policy/model/EncryptedParts', целое число, 'java/util/List', 'java/util/List', 'org/apache/cxf/message/Message' } Байт-код:
    0x0000000: 2a2a b400 2d03 2c2b 1904 b700 2e9a 0005
    0x0000010: 03ac 2a2a b400 2f04 2d2b 1904 b700 2e9a
    0x0000020: 0005 03ac 2a2a b400 3003 2c2b 1904 b700
    0x0000030: 300002: 0402: 2 0 300 000: 2 300b: 2 300b: 2-я область: 2 3002: 0302: 2: 2: 0 3002: 2: 2: 300 same_frame(@36)
    same_frame(@54)

        ... подавлено 8 строк Причины: java.lang.RuntimeException: java.lang.VerifyError: Неверный тип в стеке операндов Сведения об исключении: Расположение:
    org/apache/cxf/ws/security/wss4j/policyvalidators/AbstractSupportingTokenPolicyValidator.validateSignedEncryptedPolicies(Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/apache/cxf/message/Message: invice @ @ / wss4j / policy / model / EncryptedParts '(текущий кадр, стек [1]) нельзя назначить для' org / apache / wss4j / policy / model / SignedParts 'Текущий кадр:
    bci: @28
    flags: { }
    locals: { 'org/apache/cxf/ws/security/wss4j/policyvalidators/AbstractSupportingTokenPolicyValidator', 'java/util/List', 'java/util/List', 'java/util/List', 'org/apache/cxf/mes стек sage / Message '}: { 'org/apache/cxf/ws/security/wss4j/policyvalidators/AbstractSupportingTokenPolicyValidator', 'org/apache/wss4j/policy/model/EncryptedParts', целое число,' java / util / List ', 'java / util / List', 'org / apache / cxf / message / Message'} Байт-код: 0x0000000: 2a2a b400 2d03 2c2b 1904 b700 2e9a 0005 0x0000010: 03ac 2a2a b400 2f04 2d2b 1904 b700 2e9a 30000000000000000000000000000 1904 b700
    0x0000030: 319a 0005 03ac 2a2a b400 3203 2d2b 1904
    0x0000040: b700 31ac Таблица стековых карт:
    same_frame(@18)
    same_frame(@36)
    same_frame(@54) в ir.iais.playCommons.utils.F$Promise$1.get F.java:232) ~[play-commons_2.11-2017.0.2.12-SNAPSHOT.jar:2017.0.2.12-SNAPSHOT]
        ... 
        ... еще 5 причин: java.lang.VerifyError: Неверный тип в стеке операндов Сведения об исключении: Местоположение:
    org/apache/cxf/ws/security/wss4j/policyvalidators/AbstractSupportingTokenPolicyValidator.validateSignedEncryptedPolicies (Ljava / util / List; Ljava / util / List; Ljava / util / List; Lorg / apache / Message / CXF;)Z @28: invokespecial
  Reason: Тип 'org/apache/wss4j/policy/model/EncryptedParts' (текущий кадр, стек [1]) нельзя назначить текущему фрейму 'org/apache/wss4j/policy/model/SignedParts': bci: @ 28 flags: {} locals: {'org / apache / cxf / ws / security / wss4j / policyvalidators / AbstractSupportingTokenPolicyValidator', 'java / util / List', 'java / util / List', 'java / util / List', 'org Стек / apache / cxf / message / Message '}: { 'org/apache/cxf/ws/security/wss4j/policyvalidators/AbstractSupportingTokenPolicyValidator', 'org/apache/wss4j/policy/model/EncryptedParts', integer, 'java/util/List', 'java/util/List', 'org/apache/cxf/message/Message' } Байт-код: 0x0000000: 2a2a b400 2d03 2c2b 1904 b700 2e9a 0005 0x0000010: 03ac 2a2a b400 2f04 2d2b 1904 b700 0e002e9 03ac 2a2a b400 3003 2c2b 1904 b700
    0x0000030: 319a 0005 03ac 2a2a b400 3203 2d2b 1904
    0x0000040: b700 31ac Таблица стековых карт:
    same_frame(@18)
    same_frame(@36)
    same_frame(@54).wss4j.policyvalidators.ValidatorUtils.configureSupportingTokenValidators(ValidatorUtils.java:97) ~[cxf-rt-ws-security-3.1.7.jar:3.1.7] в org.apache.cxf.ws.security.wss4j.policyvalidators.ValidatorUtils.(ValidatorUtils.java:46) ~[cxf-rt-ws-security-3.1.7.jar:3.1.7] в org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JInInterceptor.doResults(PolicyBasedWSS4JInInterceptor.java:576) ~[cxf-rt-ws-security-3.1.7.jar:3.1.7] в org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessageInternal(WSS4JInInterceptor.java:277) ~[cxf-rt-ws-security-3.1.7.jar:3.1.7]
        at org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:171) ~[cxf-rt-ws-security-3.1.7.jar:3.1.7]
        at org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JInInterceptor.handleMessage(PolicyBasedWSS4JInInterceptor.java:80) ~[cxf-rt-ws-security-3.1.7.jar:3.1.7] в org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JInInterceptor.handleMessage(PolicyBasedWSS4JInInterceptor.java:66) ~[cxf-rt-ws-security-3.1.7.jar:3.1.7] в org.apache.cxf.phase.PhaseInterceptorCor t(PhaseInterceptorChain.java:308) ~[cxf-core-3.1.7.jar:3.1.7] в org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:798) ~[cxf-core-3.1.7.jar:3.1.7]
        at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1670) ~[cxf-rt-transports-http-3.1.7.jar:3.1.7] в org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1551) ~[cxf-rt-transports-http-3.1.7.jar:3.1.7] в org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1348) ~[cxf-rt-transports-http-3.1.7.jar:3.1.7] в org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) ~[cxf-core-3.1.7.jar:3.1.7] в org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:651) ~[cxf-rt-transports-http-3.1.7.jar:3.1.7] в org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ~[cxf-core-3.1.7.jar:3.1.7] на org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) ~[cxf-core-3.1.7.jar:3.1.7] в org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) ~[cxf-core-3.1.7.jar:3.1.7] в org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423) ~[cxf-core-3.1.7.jar:3.1.7] в org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324) ~[cxf-core-3.1.7.jar:3.1.7] в org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277) ~[cxf-core-3.1.7.jar:3.1.7] в org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) ~[cxf-rt-frontend-simple-3.1.7.jar:3.1.7] в org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139) ~[cxf-rt-frontend-jaxws-3.1.7.jar:3.1.7] в com.sun.proxy.$Proxy124.sendMessageToConsignee(Неизвестный источник) ~[?:?] В ir.iais.rasam.services.AnnouncementAboutDeclarationService$1.get(AnnouncementAboutDeclarationService.java:61) ~[classes/:?] в ir.iais.rasam.services.AnnouncementAboutDeclarationService $ 1.Get(AnnouncementAboutDeclarationService.java:48) ~[classes/:?]
        at ir.iais.playCommons.utils.F$Promise$1.get(F.java:230) ~[play-commons_2.11-2017.0.2.12-SNAPSHOT.jar:2017.0.2.12-SNAPSHOT]
        ... 
        ... еще 5

Используемые модули org.apache.wss4j артефакты это:

"org.apache.wss4j" % "wss4j-bindings" % wss4jversion,
"org.apache.wss4j" % "wss4j-policy" % wss4jversion,
"org.apache.wss4j" % "wss4j-ws-security-dom" % wss4jversion,
"org.apache.wss4j" % "wss4j-ws-security-stax" % wss4jversion,
"org.apache.wss4j" % "wss4j-integration" % wss4jversion,
"org.apache.wss4j" % "wss4j-ws-security-policy-stax" % wss4jversion,
"org.apache.wss4j" % "wss4j-ws-security-common" % wss4jversion,

куда wss4jVersion является:

val wss4jVersion = "2.1.10"

Поиском этой части: Type ... (current frame, stack[1]) is not assignable to ... Я попал на эту страницу, где говорится, что проблема в JVM. Однако этот Q/A предназначен для 2013 года, и к настоящему времени эта ошибка должна быть устранена.

Кроме того, если я заменю все вышеперечисленные зависимости от org.apache.wss4j артефакты этого: "org.apache.ws.security" % "wss4j" % "1.6.18" (ну, это означает понижение пакета), проблема будет решена и вызов службы будет работать успешно.

Теперь мой вопрос: где лежит ошибка? в JVM или WSS4J или Play Framework?

Версия Play Framework: 2.5.8

Java-версия "1.8.0_121"

Java (TM) SE Runtime Environment (сборка 1.8.0_121-b13)

1 ответ

Решение

Проблема вызвана несовместимостью версий между Apache CXF Runtime и WSS4J.

cxf-rt-ws-security 3.1.7 зависит от wss4j-policy 2.1.7, но вы используете wss4j-policy 2.1.10,

Сбой проверки байт-кода EncryptedParts класс от wss4j-policy не может быть больше назначен SignedParts (хотя в более ранних версиях эти классы были в той же иерархии).

Есть два способа решения проблемы:

  • обновить Apache CXF Runtime до версии 3.1.11 или выше;
  • понизить Apache WSS4J до версии 2.1.7 или ниже.
Другие вопросы по тегам