Что проверить, если экземпляр Jboss на сервере ведет себя иначе, чем тот же экземпляр локально? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть веб-служба Java SOAP, которая следует довольно стандартной архитектуре:

enter image description here

Клиент SOAP связывается с WebService, работающим на экземпляре Jboss (работает ли он локально или удаленно), WebService вызывает (в RMI) удаленное приложение, которое отвечает некоторыми данными и возвращает их запрашивающей стороне.

Моя проблема заключается в следующем:

  • В локальном экземпляре Jboss ответ правильно возвращается клиенту SOAP, что-то вроде этого:

    <soap:Envelope>
        <soap:Body>
            <myResponse>
                [ELEMENTS OF MY RESPONSE]
            </myResponse>
        </soap:Body>
    </soap:Envelope>
    
  • В удаленном экземпляре Jboss ответ SOAP возвращается пусто клиенту SOAP, даже если ни одна ошибка не возникает ни на стороне сервера, ни на экземпляре Jboss:

    <soap:Envelope>
        <soap:Body>
            <myResponse>
                EMPTY IN HERE
            </myResponse>
        </soap:Body>
    </soap:Envelope>
    

Поскольку он работает на локальном экземпляре, у меня не так много идей о том, как решить эту проблему.Это то, что я пробовал до сих пор:

  • Я пытался полностью перекомпилировать .war, развернутый на удаленном экземпляре - который в точности совпадает с используемым в локальном экземпляре.
  • Я попытался декомпилировать .war в удаленном экземпляре и проверить файлы wsdl / xsd, определенные для запросов и ответов: они правильные (и равны файлам в локальномэкземпляр, для чего это важно).
  • Я также пытался подключить удаленный отладчик на сервере приложений, чтобы проверить, правильно ли был подготовлен ответ при вызове удаленного экземпляра Jboss: ответправильно на стороне сервера.
  • Я также попытался выполнить другой запрос (отличный от рассматриваемого) на удаленном сервере Jboss, и ответ был возвращен правильно.
  • Я попытался сравнить standalone-full.xml (файл конфигурации) как локального, так и удаленного экземпляра, и единственное отличие, которое я вижу, - это привязка сокета для удаленного взаимодействия в удаленной версии, которую я не использую.в локальной версии:

    <socket-binding name="remoting" port="1013"/>
    
  • Наконец, я подключил удаленный отладчик к моему удаленному экземпляру Jboss и проверил, что происходит в самом WebService.Вход и выход хорошо подготовлены:

    @WebMethod
    @WebResult(name = "ProductEvaluation")
    public ProductEvaluations myAPIRequest(@WebParam(name = "XmlProducts") final XmlProducts xmlProducts,
        @WebParam(name = "ConnectedToRealtime") final boolean connectedToRealtime,
        @WebParam(name = "Timeout") final Timeout timeout) throws ProductEvaluationFault, TimeoutFault, ProductConfigurationFault, SecurityFault {
        try {
            // some stuff here...
            return result; //result contains what I want
        } catch (SecurityException e) {
            throw new SecurityFault(e.getMessage());
        }
    }
    

    Все, что происходит раньше в стеке, является общим:

    NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62  
    DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
    Method.invoke(Object, Object...) line: 498  
    ManagedReferenceMethodInterceptor.processInvocation(InterceptorContext) line: 52    
    InterceptorContext.proceed() line: 340  
    ConcurrentContextInterceptor.processInvocation(InterceptorContext) line: 45 
    InterceptorContext.proceed() line: 340  
    InitialInterceptor.processInvocation(InterceptorContext) line: 21   
    InterceptorContext.proceed() line: 340  
    ChainedInterceptor.processInvocation(InterceptorContext) line: 61   
    ComponentDispatcherInterceptor.processInvocation(InterceptorContext) line: 52   
    InterceptorContext.proceed() line: 340  
    WSComponentInstanceAssociationInterceptor.processInvocation(InterceptorContext) line: 56    
    InterceptorContext.proceed() line: 340  
    InterceptorContext.run() line: 356  
    WildFlySecurityManager.doChecked(PrivilegedExceptionAction<T>) line: 636    
    AccessCheckingInterceptor.processInvocation(InterceptorContext) line: 61    
    InterceptorContext.proceed() line: 340  
    InterceptorContext.run() line: 356  
    PrivilegedWithCombinerInterceptor.processInvocation(InterceptorContext) line: 80    
    InterceptorContext.proceed() line: 340  
    ChainedInterceptor.processInvocation(InterceptorContext) line: 61   
    ViewService$View.invoke(InterceptorContext) line: 195   
    InvocationHandlerJAXWS(AbstractInvocationHandler).invoke(Endpoint, Invocation) line: 137    
    JBossWSInvoker.performInvocation(Exchange, Object, Method, Object[]) line: 169  
    JBossWSInvoker(AbstractInvoker).invoke(Exchange, Object, Method, List<Object>) line: 96 
    JBossWSInvoker(AbstractJAXWSMethodInvoker).invoke(Exchange, Object, Method, List<Object>) line: 232 
    JBossWSInvoker(JAXWSMethodInvoker).invoke(Exchange, Object, Method, List<Object>) line: 85  
    JBossWSInvoker.invoke(Exchange, Object) line: 145   
    ServiceInvokerInterceptor$1.run() line: 59  
    Executors$RunnableAdapter<T>.call() line: 511   
    ServiceInvokerInterceptor$2(FutureTask<V>).run() line: 266  
    ServiceInvokerInterceptor$2.run() line: 126 
    SynchronousExecutor.execute(Runnable) line: 37  
    ServiceInvokerInterceptor.handleMessage(Message) line: 131  
    PhaseInterceptorChain.doIntercept(Message) line: 308    
    ChainInitiationObserver.onMessage(Message) line: 121    
    ServletDestination(AbstractHTTPDestination).invoke(ServletConfig, ServletContext, HttpServletRequest, HttpServletResponse) line: 251    
    RequestHandlerImpl.handleHttpRequest(Endpoint, HttpServletRequest, HttpServletResponse, ServletContext) line: 108   
    ServletHelper.callRequestHandler(HttpServletRequest, HttpServletResponse, ServletContext, Bus, Endpoint) line: 134  
    CXFServletExt.invoke(HttpServletRequest, HttpServletResponse) line: 88  
    CXFServletExt(AbstractHTTPServlet).handleRequest(HttpServletRequest, HttpServletResponse) line: 293 
    CXFServletExt(AbstractHTTPServlet).doPost(HttpServletRequest, HttpServletResponse) line: 212    
    CXFServletExt(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: 707   
    CXFServletExt.service(HttpServletRequest, HttpServletResponse, ServletContext) line: 136    
    WSFServlet.service(HttpServletRequest, HttpServletResponse) line: 140   
    WSFServlet(HttpServlet).service(ServletRequest, ServletResponse) line: 790  
    ServletHandler.handleRequest(HttpServerExchange) line: 85   
    ServletSecurityRoleHandler.handleRequest(HttpServerExchange) line: 62   
    ServletDispatchingHandler.handleRequest(HttpServerExchange) line: 36    
    SecurityContextAssociationHandler.handleRequest(HttpServerExchange) line: 78    
    PredicateHandler.handleRequest(HttpServerExchange) line: 43 
    SSLInformationAssociationHandler.handleRequest(HttpServerExchange) line: 131    
    ServletAuthenticationCallHandler.handleRequest(HttpServerExchange) line: 57 
    PredicateHandler.handleRequest(HttpServerExchange) line: 43 
    ServletConfidentialityConstraintHandler(AbstractConfidentialityHandler).handleRequest(HttpServerExchange) line: 46  
    ServletConfidentialityConstraintHandler.handleRequest(HttpServerExchange) line: 64  
    AuthenticationMechanismsHandler.handleRequest(HttpServerExchange) line: 60  
    CachedAuthenticatedSessionHandler.handleRequest(HttpServerExchange) line: 77    
    NotificationReceiverHandler.handleRequest(HttpServerExchange) line: 50  
    SecurityInitialHandler(AbstractSecurityContextAssociationHandler).handleRequest(HttpServerExchange) line: 43    
    PredicateHandler.handleRequest(HttpServerExchange) line: 43 
    JACCContextIdHandler.handleRequest(HttpServerExchange) line: 61 
    PredicateHandler.handleRequest(HttpServerExchange) line: 43 
    PredicateHandler.handleRequest(HttpServerExchange) line: 43 
    ServletInitialHandler.handleFirstRequest(HttpServerExchange, ServletChain, ServletRequestContext, ServletRequest, ServletResponse) line: 285    
    ServletInitialHandler.dispatchRequest(HttpServerExchange, ServletRequestContext, ServletChain, DispatcherType) line: 264    
    ServletInitialHandler.access$000(ServletInitialHandler, HttpServerExchange, ServletRequestContext, ServletChain, DispatcherType) line: 81   
    ServletInitialHandler$1.handleRequest(HttpServerExchange) line: 175 
    Connectors.executeRootHandler(HttpHandler, HttpServerExchange) line: 202    
    HttpServerExchange$1.run() line: 792    
    XnioWorker$TaskPool(ThreadPoolExecutor).runWorker(ThreadPoolExecutor$Worker) line: 1142 
    ThreadPoolExecutor$Worker.run() line: 617   
    Thread.run() line: 748  
    

Кто-нибудь имеет представление о том, как яможно отладить такого рода проблемы?Любой файл конфигурации, который я забыл проверить?

1 Ответ

0 голосов
/ 06 февраля 2019

После нескольких часов борьбы я наконец-то понял, что случилось, сам.

Хотя это может показаться простой опечаткой, это заставило меня потерять много времени и демонстрирует интересную поведенческую разницу между удаленным и локальным экземплярами Jboss, поэтому я публикую ответ, чтобы сэкономить некоторое время накто-то попадает в ту же ошибку.

Новая @WebMethod, которую я разработал, была такой:

@WebMethod
@WebResult(name = "ProductEvaluation")
public ProductEvaluations myAPIRequest(@WebParam(name = "XmlProducts") final XmlProducts xmlProducts,
    @WebParam(name = "ConnectedToRealtime") final boolean connectedToRealtime,
    @WebParam(name = "Timeout") final Timeout timeout) throws ProductEvaluationFault, TimeoutFault, ProductConfigurationFault, SecurityFault {
    try {
        // some stuff here...
        return result; //result contains what I want
    } catch (SecurityException e) {
        throw new SecurityFault(e.getMessage());
    }
}

Как вы можете заметить (я действительно потратил 4 часа, чтобы заметить это, поэтому, возможно, это не так заметно):

  • Тип возвращаемого значения функции ProductEvaluations (имеется в виду список ProductEvaluation), и это то, что также указано в wsdl и xsd

По своему опыту, следовательно, я заметил, что:

  • Когда Jboss работаетлокально аннотация @WebResult игнорируется, и результат возвращается в любом случае.
  • Однако, когда Jboss работает удаленно, это сопоставление выполняется.Следовательно, поскольку я возвращал ProductEvaluationss), но говорил, что @WebResult был ProductEvaluation (без s), то удаленный сервер ничего не отображал, и ответ становился пустым,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...