2013-10-08 23 views
3

我需要在我的xsd中使用<any>元素來提供可伸縮性。所以我使用瞭如下所示的xsd。如何在CXF中爲JAXBContext添加其他類

<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()); 
     } 

回答

1

如果有如果你想在JAXBContext要知道所有的類像下面使用的JAXBContext一個JAX-RS方法將等同於做以下電話JAXBContext.newInstance(Foo)

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

你從XML模式生成,您可以使用ContextResolverJAXBContext與域對象相關聯。

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

我使用RAD,以生成JAXB類。我沒有使用任何外部綁定文件。首先,xml如何轉換爲CXF中的對象。如何使用cxf使用的上下文來轉換對象。我沒有從你給的鏈接中理解。 – Manoj

+0

@Manoj - 我已經更新了我的答案,嘗試使其更加清晰。 –

+0

對不起,我的無知。我仍然無法明白這一點。當CXF數據綁定將知道模式中定義的所有類時。爲什麼它只知道上面的「AddInput」而不知道另一個。 – Manoj