2010-07-29 2 views
2

다음과 같은 추상 클래스가 있습니다.Java (Apache CXF, Axis 2)의 Parametrized 클래스에서 웹 서비스 (WSDL 1.2 이상) 생성

public abstract class Entity<PK extends Serializable> implements Serializable { 

    private PK id; 

    //getters and setters generated here.... 
} 

public class User extends Entity<Long> { 

    //all attributes, getters and setters are done here... 
} 

내 서비스는이

public interface EntityService { 

    public void create(Entity<? extends Serializable> entity) throws ServiceException; 
    public boolean delete(Entity<? extends Serializable> entity) throws ServiceException; 
} 

처럼 보이는 내 구현 클래스 EntityServiceImpl에 있습니다.

아파치 CXF와 웹 서비스 생성을 수행 할 때 내가 얻을 다음과 같은 예외 :

Error: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.reflect.TypeVariable 

java.lang.RuntimeException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.reflect.TypeVariable 
    at org.apache.cxf.frontend.AbstractServiceFactory.createService(AbstractServiceFactory.java:41) 
    at org.apache.cxf.tools.java2wsdl.processor.JavaToWSDLProcessor.process(JavaToWSDLProcessor.java:128) 
    at org.apache.cxf.tools.java2ws.JavaToWSContainer.processWSDL(JavaToWSContainer.java:109) 
    at org.apache.cxf.tools.java2ws.JavaToWSContainer.execute(JavaToWSContainer.java:75) 
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:103) 
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:58) 
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:40) 
    at org.apache.cxf.tools.java2ws.JavaToWS.run(JavaToWS.java:77) 
    at org.apache.cxf.tools.java2ws.JavaToWS.main(JavaToWS.java:45) 
Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.reflect.TypeVariable 
    at org.apache.cxf.jaxb.JAXBContextInitializer.addType(JAXBContextInitializer.java:232) 
    at org.apache.cxf.jaxb.JAXBContextInitializer.addType(JAXBContextInitializer.java:211) 

내 질문 : 나는 유형을 매개 변수화 또는 제네릭을 사용하고있다 웹 서비스를 생성하려면 어떻게

?

답변

2

아무도이 질문에 대답하지 않았 음을 알고, 나는 스스로에게 대답 할 것이다. 당신이 볼 수 있듯이

public List<? extends User> getParents() { 
     if (parents == null) { 
      parents = new ArrayList<User>(); 
     } 
     return this.parents; 
    } 

는,이 다음은 예외가 발생 : 아파치 CXF와

는 WS는 빈을 생성, 모든 게터는 변수가 null의 경우,이 일어나는 것을 의미하는 not null 객체를 반환 CXF를 위해 :

  • 직렬화 클래스는 인터페이스입니다, 그래서 형 Serializable의 변수가있는 경우 CXF는 클라이언트 소스 코드를 생성 할 때, new Serializable()은 정의 할 수 없습니다.
  • 모든 개체 public 생성자를 구현해야합니다.

위의 예외는 2 가지 원칙에 대한 오류입니다.


속성 private List<? extends User> parents를 들어

솔루션, 우리는이를 추가했습니다.

@XmlElements({ 
    @XmlElement(type=Man.class), 
    @XmlElement(type=Female.class), 
    @XmlElement(type=Child.class) 
}) 
private List<? extends User> parents; 

그리고 인터페이스

, 우리는 XmlJavaTypeAdapter을 사용하고 그 인터페이스의 모든 구현 서브 클래스 용 어댑터,

예를 썼다

public class IntegerConstraintBaseAdapter extends XmlAdapter<IntegerConstraint, ConstraintBase<Integer>> { 

    /* (non-Javadoc) 
    * @see javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object) 
    */ 
    @Override 
    public IntegerConstraint marshal(ConstraintBase<Integer> v) throws Exception { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    /* (non-Javadoc) 
    * @see javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object) 
    */ 
    @Override 
    public ConstraintBase<Integer> unmarshal(IntegerConstraint v) throws Exception { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

희망이 있으면 도움이 될 것입니다.