2008-10-29 5 views
4

복잡한 다형성 값을 반환해야하는 JAX-RPC (Java) 웹 서비스가 있습니다. 구체적으로는, 클래스의 구조는 다음과 같은 것입니다 :JAX-RPC 웹 서비스의 다형성

abstract class Child { 
} 

class Question extends Child { 
    private String name; 
    // other fields, getters, and setters 
} 

class Section extends Child { 
    private String label; 
    private Child[] children; 
    // getters and setters 
} 

class Quiz { 
    private Child[] elements; 
    // getter and setter 
} 

내 웹 서비스는 물론 질문과 다른 섹션을 포함 할 수 있습니다 질문과 섹션을 포함 할 수있는 퀴즈를 반환하는 방법이있다, 등등 기타 등등. 그러나 WSDL을 생성 할 때 자식 및 퀴즈 만 생성됩니다. 웹 서비스를 호출하면 올바른 수의 자식으로 퀴즈 요소가 반환되지만 모든 자식 요소이므로 모두 비어 있습니다. .

XML을 문자열로 반환하는 것보다 짧은 방법으로이 작업을 수행 할 수있는 좋은 방법이 있습니까?

누구든지 내 통제 범위를 벗어난 상황으로 인해 JAX-WS를 사용할 수 없습니다.

답변

1

JAX-RPC가 그런 방식으로 다형성을 지원한다고 생각하지 않습니다. 나는 비슷한 문제를 안고 있으며 반환 할 수있는 두 클래스 각각에 대해 하나씩, 그리고 반환하려는 유형에 따라 하나만 채우는 멤버가 두 개인 클래스를 만들어 해결해야했습니다. 귀하의 경우 그래서 : 아이의 구성원이 채워되는 확인하는 클라이언트를 필요로하고, 끔찍하게 못생긴

class Child 
{ 
    private Section section; 
    private Question question; 

    // Constructor, etc... 
} 

class Question 
{ 
    private String name; 
    // other fields, getters, and setters 
} 

class Section 
{ 
    private String label; 
    private Child[] children; 
    // getters and setters 
} 

class Quiz 
{ 
    private Child[] elements; 
    // getter and setter 
} 

, 나는 알고있다.

+0

hacktastic이지만 Java 객체를 사용하는 것이 가장 좋은 방법 일 수 있습니다. 이제는 XML 형식으로 변환하는 것이 더 나은지 아닌지를 결정해야합니다. –

1
어쩌면 누군가가 여전히 찾고있다, 그것은 축 1.4에서 수행 할 수 있습니다

:

<parameter name="emitAllTypesInWSDL" value="true" /> 
  • :

    1. 가 축 웹 서비스 배포 파일의 사용자 섹션 (WSDD)에 다음 줄을 추가

      <axis-java2wsdl ... extraClasses="..."></axis-java2wsdl> 
      

      extraClasses의 menti에서 :

      은 'extraClasses'를 포함하는 개미 빌드 파일에서 작업을 수정 전달 될 모든 클래스에서, 축은 매개 변수로 전달하거나 리턴 할 자식을 추측 할 수 없기 때문에.

    완료, 이제 메소드에서 파생 클래스를 부모 클래스를 허용 할 수 있습니다. 기타 :

    // server side class A { ...} 
    class B extends A {...} 
    class C extends A {...} 
    
    // ws 
    class wsAxis { public void processPolymorphCall(A obj); } 
    
    // client side 
    wsAxis.processPolymorphCall(new C()); 
    
    // this will work now, as much as returning derivated classes in place of base class.