1

私はしばらくこの問題に悩まされており、正しい方向に進むことを望んでいました. 複雑なオブジェクトを適切にマーシャリングしようとしていますが、1 つの特定の関係を除いて、すべてが適切に XML にエクスポートされます。Spring @Endpoint 実装を使用しています。

私の問題を引き起こしているクラスは、AbstractDependent です。

私のモデルは次のとおりです(コード例):

@XmlRootElement
public class RootClass{

    private Set<AbstractClassA> classASet;
    private Client client;

    //... getters/setters (no special annotations)
}

@XmlRootElement
public class Client extends AbstractApplicant{
    private List<AbstractDependent> dependentList;

    //..more attributes... setter/getters
}

@XmlRootElement
public class Child extends AbstractDependent{
  //class attributes
}

@XmlRootElement
public class Spouse extends AbstractDependent{
  //class attributes
}

//tried putting the @XmlSeeAlso annotation, no success
public abstract class AbstractDependent extends AbstractApplicant{
  //class attributes
}

public abstract class AbstractApplicant{
  //class attributes
}


//No Special annotations
public abstract class AbstractClassA{
  //class attributes
}

//The only special annotation is the XmlRootElement, other attributes are atomic
@XmlRootElement
public class ImplA extends AbstractClassA{
  //class attributes
}

すべてのクラスは同じパッケージに含まれています。package-info.java ファイルを使用して名前空間を指定します。

Spring のMarshallingPayloadMethodProcessorでマーシャラーを調べましたが、JaxB コンテキストには上記のすべてのクラスが含まれているため、これは問題ではありません。

ちなみに、実装されたAsbtractClassAのクラスは問題なく、「type」属性を使用して xml で適切に変換されます。出力の例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<ns3:rootClass xmlns:ns3="http://mynameservice.com/schema/webservice">

    <ns3:abstractClassA xsi:type="ns3:implA">
        <id>1</id>
    </ns3:abstractClassA>
    <ns3:abstractClassA xsi:type="ns3:implB">
        <id>2</id>
    </ns3:abstractClassA>

    <ns3:client>
        <id>15</id>
        <ns3:dependentList>
        <id>17</id>
        <!-- other attributes -->
        </ns3:dependentList>
        <ns3:dependentList>
        <id>18</id>
        <!-- other attributes, excluding the ones from the Child And Spouse class  -->      
        </ns3:dependentList>
    </ns3:client>

</ns3:rootClass>

xsi:typeはAbstractClassAで適切に定義されていますが、 AbstractDependentでは定義されていません。その理由や方法を理解できないようです。明らかに、私のモデルはこれよりもはるかに大きいですが、dependentList だけが問題を引き起こしている要素です。@XmlTransiant要素をdependentList に配置してもまったく役に立たないことに注意してください。xmlからオブジェクトを完全に除外します (多くのインターネット投稿でこれを行うことが提案されています)。

定義されたマーシャラーは次のとおりです。ここでも、コンテキストには必要なすべてのクラスが含まれています。

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="packagesToScan">
        <list>
            <value>com.company.*</value>
        </list>
    </property>
</bean> 

いくつかの構成:

<bean id="messageReceiver"
    class="org.springframework.ws.soap.server.SoapMessageDispatcher">
    <property name="endpointAdapters">
        <list>
            <ref bean="defaultMethodEndpointAdapter" />
        </list>
    </property>
</bean> 

<bean id="defaultMethodEndpointAdapter" 
    class="org.springframework.ws.server.endpoint.adapter.DefaultMethodEndpointAdapter">
    <property name="methodReturnValueHandlers">
        <list>
            <ref bean="marshallingPayloadMethodProcessor"/>
        </list>
    </property>
    <property name="methodArgumentResolvers">
        <list>
            <ref bean="marshallingPayloadMethodProcessor"/>
        </list>
    </property>     
</bean>  

<bean id="marshallingPayloadMethodProcessor"
    class="org.springframework.ws.server.endpoint.adapter.method.MarshallingPayloadMethodProcessor">
    <constructor-arg ref="jaxbMarshaller" />
    <constructor-arg ref="jaxbMarshaller" />
</bean> 

正しい方向に進んでいただければ幸いです。どうもありがとうございました。

4

1 に答える 1

0

何時間もの調査の末、問題を発見しました。これは、まだ遅延ロードされたオブジェクトを MarshallingPayloadMethodProcessor に渡す休止状態が原因でした。オブジェクトはマーシャリングされる前に適切に初期化されると想定していました。

カスタム XmlAdapter を作成しました。

public class HibernatetEntityAdapter extends XmlAdapter<AbstractEntity, AbstractEntity> {

@Override
public AbstractEntity unmarshal(AbstractEntity v) throws Exception {
    return v;
}

@Override
public AbstractEntity marshal(AbstractEntity v) throws Exception {
    return HibernateUtils.unenhanceObject(v);
}

}

ここで、クラスに次の注釈を追加するだけで問題が発生します。

@XmlJavaTypeAdapter(HibernatetEntityAdapter.class)

ありがとう、JP

于 2013-11-19T21:59:52.573 に答える