3

Spring フレームワークを使用して独自の安らかな Web サービスを作成するために、このチュートリアルに従おうとしていました。クライアントはGETリクエストを行います

http://api.myapp/app/students

そして、サーバーはオブジェクト クラスルームの xml バージョンを返します。

@XmlRootElement(name = "class")
    public class Classroom {

    private String classId = null;
    private ArrayList<Student> students = null;

    public Classroom() {
    }
    public String getClassId() {
        return classId;
    }
    public void setClassId(String classId) {
        this.classId = classId;
    }
    @XmlElement(name="student")
    public ArrayList<Student> getStudents() {
        return students;
    }
    public void setStudents(ArrayList<Student> students) {
        this.students = students;
    }
    }

オブジェクト Student は、文字列のみを含む別の Bean です。

私の app-servlet.xml で、次の行をコピーしました。

<bean id="studentsView" class="org.springframework.web.servlet.view.xml.MarshallingView">
    <constructor-arg ref="jaxbMarshaller" />
</bean>

<!-- JAXB2 marshaller. Automagically turns beans into xml -->
<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="classesToBeBound">
        <list>
            <value>com.spring.datasource.Classroom</value>
            <value>com.spring.datasource.Student</value>
        </list>
    </property>
</bean>

ここで私の質問は次のとおりです。文字列以外のオブジェクトをクラス変数として挿入したい場合はどうすればよいですか? 次のような InetAddress の文字列バージョンを含むタグが必要だとしましょう。

<inetAddress>192.168.1.1</inetAddress>

JAXB にメソッド inetAddress.toString() を強制的に呼び出して、xml で文字列として表示されるようにするにはどうすればよいですか? 返された xml では、文字列以外のオブジェクトは無視されます!

4

2 に答える 2

1

Blaiseとこの回答のおかげで、すべてをセットアップすることができました。それらをまとめるために、ここに私の場合があります:

対象デバイスは次のとおりです。

@XmlRootElement(name="device")
public class Device {
    private String id;
    private String name;
    private String location;

    private InetSocketAddress address;
    private InetSocketAddress gatewayAddress;

    (omitted setters and getters...)        
}

InetSockeAddressAdapter:

public class InetSocketAddressAdapter extends XmlAdapter<String, InetSocketAddress>{
    @Override
    public String marshal(InetSocketAddress v) throws Exception {
        return v.toString();
    }
    @Override
    public InetSocketAddress unmarshal(String v) throws Exception {
        String[] comp = v.split(":");
        return new InetSocketAddress(comp[0], new Integer(comp[1]));
    }

}

オブジェクトとアダプターの両方のパッケージに package-info.java を追加します (IDE で package-info という名前のクラスを作成できなかったため、Eclipse で単純なファイルとして作成されました)。

@XmlJavaTypeAdapters({
            @XmlJavaTypeAdapter(type=InetSocketAddress.class, 
                value=InetSocketAddressAdapter.class)})
package com.enrico.apiserver.domain;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

Bean を宣言する必要がある *-servlet.xml 行:

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
            <list>
                <value>com.enrico.apiserver.domain.Device</value>
            </list>
        </property>
        <property name="adapters">
            <list>
                <bean class="com.enrico.apiserver.domain.InetSocketAddressAdapter" />
            </list>
        </property>
    </bean>
于 2012-10-08T09:35:07.390 に答える
1

を使用しXmlAdapterて、XML からオブジェクトを変換する方法を制御できます。あなたXmlAdapterのオブジェクトを に/から変換するロジックを記述しますString

于 2012-10-07T23:17:43.917 に答える