3

次の xml は、サーバー上のリポジトリにあります。

   <author xmlns="http://www..." xmlns:atom="http://www.w3.org/2005/atom">
     <name>S. Crocker</name>
     <address>None</address>
     <affiliation></affiliation>
     <email>None</email>
   </author>

私のモデルクラス:

  @XmlRootElement(name = "author", namespace="http://www...")
  @XmlAccessorType(XmlAccessType.FIELD)
  public class Author {


    @XmlAttribute(name="author")
    private String author;
    @XmlElement(name="name")
private String name;
    @XmlElement(name="address")
private String address;
    @XmlElement(name="affiliation")
private String affiliation;
    @XmlElement(name="email")
    private String email;



    public String getAuthor() {
    return author;
}
public void setAuthor(String author) {
    this.author = author;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getAddress() {
    return address;
}
public void setAddress(String address) {
    this.address = address;
}
public String getAffiliation() {
    return affiliation;
}
public void setAffiliation(String affiliation) {
    this.affiliation = affiliation;
}
public String getEmail() {
    return email;
}
public void setEmail(String email) {
    this.email = email;
}

 }

チュートリアルによると、 @XmlSchema を package-info.java に使用する必要があるとのことですが、package-info.java クラスを作成しましたが、これを処理する方法がわかりません。

実際、私の問題は、正しい注釈を使用してxmlをモデルクラスにバインドする方法がわからないことです。全体的な話は、リポジトリから XML ドキュメントを取得しようとしているということですが、null 値を取ります。ここで見た問題: JAXB: 要素を名前空間にバインドする方法 は、正しい注釈を使用していないことです。どれが正しい注釈で、どのように使用すればよいか、誰かが知っていますか?

4

2 に答える 2

3

Below is an example of how you could map this use case:

package-info

I would use the package level @XmlSchema annotation to specify the namespace qualification. Specify the namespace to be your target namespace ("http://www.../ckp"). You want this namespace applied to all XML elements so specify elementFormDefault=XmlNsForm.QUALIFIED. The use xmlns to asssociate prefixes with your namespace URIs.

@XmlSchema(
    namespace="http://www.../ckp",
    elementFormDefault=XmlNsForm.QUALIFIED,
    xmlns={
        @XmlNs(prefix="", namespaceURI="http://www.../ckp"),
        @XmlNs(prefix="atom", namespaceURI="http://www.w3.org/2005/atom"),
    }
)
package forum10388261;

import javax.xml.bind.annotation.*;

Author

Below is what your Author class would look like. I have removed the unnecessary annotations (annotations that were equivalent to the default mapping).

package forum10388261;

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Author {

    @XmlAttribute
    private String author;
    private String name;
    private String address;
    private String affiliation;
    private String email;

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getAffiliation() {
        return affiliation;
    }

    public void setAffiliation(String affiliation) {
        this.affiliation = affiliation;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

Demo

package forum10388261;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Author.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum10388261/input.xml");
        Author author = (Author) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(author, System.out);
    }

}

Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<author xmlns:atom="http://www.w3.org/2005/atom" xmlns="http://www.../ckp">
    <name>S. Crocker</name>
    <address>None</address>
    <affiliation></affiliation>
    <email>None</email>
</author>

For More Information

于 2012-05-01T19:02:08.390 に答える
0

namespaceパラメータをオンにする必要はありませんでした@XmlRootElement。オフのままにしてみてください。また、を@XmlAttribute指定しましたが、例にはタグ名以外はauthorありません。author

はどうかと言うと:

実際、私の問題は、corectアノテーションを使用してxmlをモデルクラスにバインドする方法がわからないことです。

春の設定では、次のことができます。

<oxm:jaxb2-marshaller id="jaxb2Marshaller">
    <oxm:class-to-be-bound name="com.mycompany.Author"/>
    <!-- ... -->
</oxm:jaxb2-marshaller>

jaxb2Marshaller次に、直接注入するか、次のMessageConverterように使用します。

<bean id="xmlConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
    <constructor-arg>
        <ref bean="jaxb2Marshaller"/>
    </constructor-arg>
    <property name="supportedMediaTypes">
        <list>
            <bean class="org.springframework.http.MediaType">
                <constructor-arg index="0" value="application"/>
                <constructor-arg index="1" value="xml"/>
                <constructor-arg index="2" value="UTF-8"/>
            </bean>
        </list>
    </property>
</bean>

AnnotationMethodHandlerAdapterSpringのコンテンツネゴシエーションを使用する場合は、メッセージコンバーターで使用できます。

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <list>
            <ref bean="xmlConverter"/>
            <!-- other converters if you have them, e.g. for JSON -->
        </list>
    </property>
</bean>
于 2012-05-01T12:15:08.110 に答える