4

<any>スケーラビリティのために xsd で要素を使用する必要があります。だから私は以下のように xsd を使用しました。

<complexType name="AddInput">
        <sequence>
            <element name="First" type="int"></element>
            <element name="Sec" type="int"></element>
            <any processContents="lax" namespace="##any" minOccurs="0" maxOccurs="unbounded"></any>
        </sequence>
    </complexType>

<any>ObjectFactory (@XMLRegistry、@XmlElementDecl) を使用して、プレースホルダーに配置する複雑なオブジェクトを定義しましたが、それでもコードの下で実行すると、

org.apache.xerces.dom.ElementNSImpl

JAXBElementObject の代わりに。Google で検索したところ、JAXBContext がスキーマについて知っている必要があることがわかりました。しかし、JAXBContext に複雑なオブジェクトを認識させる方法がわかりません。どんなアイデアでも役に立ちます。

        List<Object> elemList = (List<Object>)input.getAny();
        for(Object elem : elemList){
            System.out.println(elem.getClass());
        }
4

2 に答える 2

1

次のような JAX-RS メソッドがある場合、JAXBContext使用されるメソッドは、次の呼び出しを行うことと同等です。JAXBContext.newInstance(Foo)

@GET
@Produces(MediaType.APPLICATION_XML)
@Path("{id}")
public Foo read(@PathParam("id") long id) {
    return entityManager.find(Foo.class, id);
}

XML スキーマから生成したすべてのクラスを に認識させたい場合は、を使用して をドメイン オブジェクトにJAXBContext関連付けることができます。JAXBContextContextResolver

import java.io.*;
import java.util.*;     
import javax.ws.rs.Produces;
import javax.ws.rs.ext.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

@Provider
@Produces(MediaType.APPLICATION_XML)
public class FooContextResolver implements ContextResolver<JAXBContext> {

    private JAXBContext jc;

    public FooContextResolver() {
        try {
            jc = JAXBContext.newInstance("com.example.foo");
        } catch(JAXBException e) {
            throw new RuntimeException(e);
        } 
    }

    public JAXBContext getContext(Class<?> clazz) {
        if(Foo.class == clazz) {
            return jc;
        }
        return null;
    }

} 

于 2013-10-08T10:29:25.207 に答える