我们有一个web服务,其实现在.net中完成 . 我们从java调用这个web服务 . web服务在大多数情况下都完全正常,但有时它会抛出IllegalArgumentException .

Web服务有两个名为pointEnquiry和pointEarnedEnquiry的方法 . 这两种方法都有一个参数,如pointEnquiryResult和pointEarnedEnquiryResult . 响应包装器分别是PointEnquiryResponse和PointsEarnedEnquiryResponse .

遇到的问题是抛出IllegalArgumentException,状态无法将PointEnquiryRespone.pointEnquiryResult设置为PointEarnedEnquiryResponse .

此外,这两种方法的返回类型都是JAXBElement .

我无法理解与包装类相关的返回类型是什么以及为什么pointEnquiryResult在不属于该类时尝试将自身映射到PointEarnedEnquiry响应 .

请找到堆栈跟踪

javax.xml.ws.WebServiceExcep`tion:java.lang.IllegalArgumentException:无法在org.jboss.ws中将com.abc.xyz.PointEnquiryResponse.pointEnquiryResult设置为com.abc.xyz.PointEarnedEnquiryResponse的javax.xml.bind.JAXBElement字段com.abc.xyz.PointEnquiryResponse.pointEnquiryResult位于org.jboss.ws.core.jaxws的org.jboss.ws.core.jaxws.client.ClientImpl.invoke(ClientImpl.java:314)中的.core.jaxws.client.ClientImpl.handleRemoteException(ClientImpl.java:404) .client.ClientProxy.invoke(ClientProxy.java:172)位于com.hh的$ Proxy464.pointEarnedEnquiry(未知来源)的org.jboss.ws.core.jaxws.client.ClientProxy.invoke(ClientProxy.java:152) . 在太阳下的sun.reflect.GeneratedMethodAccessor2561.invoke(未知来源)的com.hh.test.service.kioskInterface.KioskEndPointImpl.pointsEarnedEnquiry(KioskEndPointImpl.java:704)上的test.client.KioskService.pointEarnedEnquiry(CMPKioskService.java:118) . 在org.jboss.aop.joinpoint.MethodInvocat的java.lang.reflect.Method.invoke(Method.java:597)中反映.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)中的org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)中的ion.invokeNext(MethodInvocation.java:112) .gboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)位于org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation)的org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) .java:101)org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)位于org.jboss.aspects.tx的org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) . 位于org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)的org.jboss.aspects.tx.TxInterceptor $ Required.invoke(TxInterceptor.java:191)中的TxPolicy.invokeInOurTx(TxPolicy.java:79)在org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterce) ptor.java:95)org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)org.jboss.aop位于org.jboss.easb.security.RoleBasedAuthorizationInterceptor.invoke的org.jboss.aspects.security.RoleBasedAuthorizationInterceptor.invoke(RoleBasedAuthorizationInterceptor.java:166)中的.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)(RoleBasedAuthorizationInterceptor.java:115 )org.jboss.eab.ecurity.invocation上的org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)中的org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) . 或者org.jboss.ejb3.security.Ejb3AuthenticationInterceptor . 在org.jboss.eabb上的org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)的org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)中调用(Ejb3AuthenticationInterceptor.java:110) .joinpoint.MethodInvocati位于org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)的on.invokeNext(MethodInvocation.java:101)org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)at org位于org.jboss.wsf.stack.jbws的org.jboss.ws.core.server.ServiceEndpointInvoker.invoke(ServiceEndpointInvoker.java:221)的.jboss.wsf.container.jboss42.InvocationHandlerEJB3.invoke(InvocationHandlerEJB3.java:103) .RequestHandlerImpl.processRequest(RequestHandlerImpl.java:466)atorg.jboss.wsf.stack.jbws.RequestHandlerImpl.handleRequest(RequestHandlerImpl.java:284)位于org.jboss.wsf.stack的org.jboss.wsf.stack.jbws.RequestHandlerImpl.doPost(RequestHandlerImpl.java:201) . 位于org.jboss.wsf.stack.jbws.EndpointServlet.service(EndpointServlet.java:84)的jbws.RequestHandlerImpl.handleHttpRequest(RequestHandlerImpl.java:134),位于javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)org.apache.atfilter.inFilter(ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.jboss.web.tomcat.filters.ReplyHeaderFilter .doFilter(ReplyHeaderFilter.java:96)org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org . org.apache.catalina.core.Standa上的apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) rdContextValve.invoke(StandardContextValve.java:175)org.apache.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:524)在Org.apache.atache.alvoke(JaccContextValve.java:84)org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)org.apache.catalina.valves.ErrorReportValve上的org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)位于org.apache.catalina.core.StandardEngineValve.invoke的org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)中的.invoke(ErrorReportValve.java:102)(StandardEngineValve.java:109 )org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)at org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583)at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:446) )在java.lang.Thread.run(Thread.java:662)引起:java.lang.IllegalArgumentException:无法将com.ballytech.kioskpoint中的javax.xml.bind.JAXBElement字段com.ballytech.kioskpointsenquiry.PointEnquiryResponse.pointEnquiryResult设置为com.ballytech . kioskpointsenquiry.PointEarnedEnquiryResponse在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:146)在sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:150)在sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)在阳光下.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:18)at java.lang.reflect.Field.get(Field.java:358)at com.sun.xml.bind.v2.runtime.reflect.Accessor $ FieldReflection.get (Accessor.java:231)com.sun.xml.bind.v2.runtime.property.SingleReferenceNodeProperty $ 1.get(SingleReferenceNodeProperty.java:141)at com.sun.xml.bind.v2.runtime.reflect.Accessor . getUnadapted(Accessor.java:147)位于com.sun.xml.bind.v 2.runtime.JAXBContextImpl $ 6.get(JAXBContextImpl.java:917)位于org.jboss.ws.core.jaxrpc.ParameterWrapping.unwrapResponseParameters的org.jboss.ws.metadata.accessor.JAXBAccessor.get(JAXBAccessor.java:50) (参数包装.java:226)位于org.jboss的org.jboss.ws.core.CommonClient.syncOutputParams(CommonClient.java:510)org.jboss.ws.core.CommonClient.invoke(CommonClient.java:396) . ws.core.jaxws.client.ClientImpl.invoke(ClientImpl.java:302)

请找到更多详情:

以下是用于调用Web服务的代码 . 它使用RPC样式通信 .

public PlayerPointsEnquiryParameter pointEnquiry(String playerId) throws Exception {
    PlayerPointsEnquiryParameter playerPointsEnquiryParameter  =null;
    try {
        if(iPointsEnquiry == null){
            URL wsdlURL = new URL(SWSUtility.getCMPPointEquiryURL());
            if(logger.isDebugEnabled()){
                logger.debug("URL invoked : " + wsdlURL.toString());
            }
            Service service = Service.create(wsdlURL,_cmpPointEnqiry_QNAME);
            iPointsEnquiry = service.getPort(IPointsEnquiry.class);
        }

        playerPointsEnquiryParameter  = iPointsEnquiry.pointEnquiry(playerId);
        if(logger.isDebugEnabled()){
            logger.debug("playerPointsEnquiryParameter"+ playerPointsEnquiryParameter);
        }
    } catch (MalformedURLException e) {
        iPointsEnquiry = null;
        logger.error("Malformed URL", e);
        throw e;
    } catch (Exception e) {
        iPointsEnquiry = null;
        logger.error("Exception @", e);
        throw e;
    }
    return playerPointsEnquiryParameter;
}

public PlayerPointsEnquiryParameter pointEarnedEnquiry(String partonID, GregorianCalendar dtStartDate, GregorianCalendar dtEndDate ) throws Exception {
    PlayerPointsEnquiryParameter playerPointsEnquiryParameter  =null;
    try {
        XMLGregorianCalendar calenderdtStartDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(dtStartDate);  
        XMLGregorianCalendar calendedtEndDater = DatatypeFactory.newInstance().newXMLGregorianCalendar(dtEndDate);
        if(iPointsEnquiry == null){
            URL wsdlURL = new URL(SWSUtility.getCMPPointEquiryURL());
            if(logger.isDebugEnabled()){
                logger.debug("URL invoked : " + wsdlURL.toString());
            }
            Service service = Service.create(wsdlURL,_cmpPointEnqiry_QNAME);
            iPointsEnquiry = service.getPort(IPointsEnquiry.class);
        }

        playerPointsEnquiryParameter  = iPointsEnquiry.pointEarnedEnquiry(partonID, calenderdtStartDate, calendedtEndDater);
        if(logger.isDebugEnabled()){
            logger.debug("playerPointsEnquiryParameter"+ playerPointsEnquiryParameter);
        }
    } catch (MalformedURLException e) {
        logger.error("Malformed URL", e);
        iPointsEnquiry = null;
        throw e;
    } catch (Exception e) {
        logger.error("Exception @", e);
        iPointsEnquiry = null;
        throw e;
    }
    return playerPointsEnquiryParameter;
}

以下是实施

public abstract interface IPointsEnquiry
{
  @WebMethod(operationName="PointEnquiry", action="http://www.hhtechno.com/KioskPointsEnquiry/IPointsEnquiry/PointEnquiry")
  @WebResult(name="PointEnquiryResult", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry")
  @RequestWrapper(localName="PointEnquiry", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry", className="com.hhtechno.kioskpointsenquiry.PointEnquiry")
  @ResponseWrapper(localName="PointEnquiryResponse", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry", className="com.hhtechno.kioskpointsenquiry.PointEnquiryResponse")
  @Action(input="http://www.hhtechno.com/KioskPointsEnquiry/IPointsEnquiry/PointEnquiry", output="http://www.hhtechno.com/KioskPointsEnquiry/IPointsEnquiry/PointEnquiryResponse")
  public abstract PlayerPointsEnquiryParameter pointEnquiry(@WebParam(name="strPlayerId", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry") String paramString);


  @WebMethod(operationName="PointEarnedEnquiry", action="http://www.hhtechno.com/KioskPointsEnquiry/IPointsEnquiry/PointEarnedEnquiry")
  @WebResult(name="PointEarnedEnquiryResult", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry")
  @RequestWrapper(localName="PointEarnedEnquiry", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry", className="com.hhtechno.kioskpointsenquiry.PointEarnedEnquiry")
  @ResponseWrapper(localName="PointEarnedEnquiryResponse", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry", className="com.hhtechno.kioskpointsenquiry.PointEarnedEnquiryResponse")
  @Action(input="http://www.hhtechno.com/KioskPointsEnquiry/IPointsEnquiry/PointEarnedEnquiry", output="http://www.hhtechno.com/KioskPointsEnquiry/IPointsEnquiry/PointEarnedEnquiryResponse")
  public abstract PlayerPointsEnquiryParameter pointEarnedEnquiry(@WebParam(name="strPlayerId", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry") String paramString, @WebParam(name="strStartDate", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry") XMLGregorianCalendar paramXMLGregorianCalendar1, @WebParam(name="strEndDate", targetNamespace="http://www.hhtechno.com/KioskPointsEnquiry") XMLGregorianCalendar paramXMLGregorianCalendar2);
}

我面临的问题是其中一个线程让我们说t1正在调用方法pointEnquiry并等待响应 . 同时,另一个线程t2进入图片并调用pointsEarnedEnquiry . 几秒钟后,线程t1抛出IllegalArgumentException,如上所述 .

我检查了服务器端,对于线程t1发出的请求,生成并发送了适当的响应 .

我的问题:

  • 由于Web服务中两个web方法的返回类型相同,即PlayerPointsEnquiryMethod,我在客户端没有进行任何类型的解包,为什么我会得到一个例外说法

无法将javax.xml.bind.JAXBElement字段com.hhtechno.kioskpointsenquiry.PointEarnedEnquiryResponse.pointEarnedEnquiryResult设置为com.hhtechno.kioskpointsenquiry.PointEnquiryResponse .

  • 两种方法的区别在于Request和Response Wrappers . 而pointsEnquiry将ResponseWrapper作为PointsEnquiryResponse,pointsEarnedEnquiry将ResponseWrapper作为PointsEarnedEnquiryResponse . 必须有一些东西指示unmarshaller打开对PointsEarnedEnquiryResponse或PointsEnquiryResponse的响应 . 如果我错了,请指导我 .

  • 代码在大多数情况下工作正常,它只抛出IllegalArgumentException几次 . 这是否与某些缓存问题有关?

请求社区的帮助,因为我已经尝试了很多,并且如何继续前进 .