如何在CXF中向JAXBContext添加其他类

问题描述 投票:3回答:2

我需要在我的xsd中使用<any>element来实现可伸缩性。所以我使用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。我在谷歌搜索,我看到JAXBContext应该知道架构。但我不确定,如何使JAXBContext知道我的复杂对象。任何想法都会有所帮助。

        List<Object> elemList = (List<Object>)input.getAny();
        for(Object elem : elemList){
            System.out.println(elem.getClass());
        }
rest jaxb cxf
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);
}

如果您希望JAXBContext知道您从XML模式生成的所有类,可以使用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;
    }

} 


0
投票

你需要设置:

jaxb.additionalContextClasses

见:https://stackoverflow.com/a/55485843/1634131

© www.soinside.com 2019 - 2024. All rights reserved.