1

JBoss サーバーでホストされているテスト環境で実行されている既存のレガシー Web サービスにバインドしようとしていますが、Spring は以下の例外により Bean を作成できません。

Caused by: javax.xml.ws.WebServiceException: Unable to create JAXBContext
    at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:153)
    at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:83)
    at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:244)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.createSEIPortInfo(WSServiceDelegate.java:687)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.addSEI(WSServiceDelegate.java:675)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:330)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:313)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:295)
    at javax.xml.ws.Service.getPort(Service.java:92)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.getPortStub(JaxWsPortClientInterceptor.java:413)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.prepare(JaxWsPortClientInterceptor.java:337)
    at org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.afterPropertiesSet(JaxWsPortClientInterceptor.java:316)
    at org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean.afterPropertiesSet(JaxWsPortProxyFactoryBean.java:42)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)
    ... 38 more
Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.lang.StackTraceElement does not have a no-arg default constructor.
    this problem is related to the following location:
        at java.lang.StackTraceElement
        at public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace()
        at java.lang.Throwable
        at java.lang.Exception
        at uk.co.example.UserException
        at public javax.xml.bind.JAXBElement uk.co.example.ObjectFactory.createUserException(uk.co.example.UserException)
        at uk.co.example.ObjectFactory

    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:140)

Spring xml を介して Web サービスにバインドしています。

<bean id="auth1" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
    <property name="serviceInterface" value="uk.co.example.Authentication" />
    <property name="wsdlDocumentUrl" value="http://testdomain.co.uk:30001/services/authentication?wsdl" />
    <property name="namespaceUri" value="http://example.co.uk/" />
    <property name="serviceName" value="AuthenticationWebServiceService" />
    <property name="portName" value="AuthenticationPort" />
    <property name="maintainSession" value="true" />
</bean>

私の UserException は単に java.lang.Exception を拡張します:

public class UserException extends Exception
{

}

したがって、私の Web サービスには、UserException のスローを宣言するメソッドが含まれています。UserException は、引数のないコンストラクターを持たない StackTraceElement への参照を含む java.lang.Exception を拡張します。したがって、JAXB 例外です。この件に関する他のいくつかの投稿から私が拾ったのはそれだけです。

私が理解できないのは、なぜこの特定の Web サービスとこの特定の例外クラスなのかということです。そしてもちろん、これをどのように修正しますか?

私の Web サービスは、他にも多数の例外をスローします (ほとんどの例外は java.lang.Exception を拡張しているように見えます)。同じ JBoss サーバーで実行される別の Web サービス (UserException はスローしませんが、他の特注の Exception サブクラスをスローします) は正常に動作します。2 つの異なる Web サービス セットには、異なるクライアント jar があります。

Spring テストと Web jar (v3.1.0)、junit、および log4j を取り込んだ Eclipse Maven プロジェクトを作成しただけです。2 つのクライアント jar (レガシー ビルドの一部として既存) もクラスパスにあります。Proxy Bean を Authentication インターフェースとして自動配線し、その上で authenticateUser() メソッドを呼び出す Junit を作成しました。

これはレガシー コードであるため、実行中の Web サービスや生成されたクライアント jar を変更することはできません。

助言がありますか?

Web サービスや、レガシー コードの構築方法や展開方法に関しては、私が少し初心者だったことを認めます。

4

1 に答える 1

0

クライアントまたはサーバー コードを変更できない場合でも、既存のクライアントを拡張する独自のクライアントを作成し、そこにカスタム JAXB バインディングを追加することができます。

于 2013-01-09T20:26:56.627 に答える