Pergunta

Eu tenho um serviço web JAX-RPC (Java) que precisa retornar um valor polimórfico complexo. Para ser mais específico, a estrutura de classes é algo como isto:

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
}

O meu serviço web tem um método que retorna um Teste, o que naturalmente pode conter perguntas e secções que podem conter perguntas e outras seções, e assim por diante e assim por diante. No entanto, quando eu gerar o WSDL, filho único e quiz fazer isso. Quando eu chamar o serviço web, eu voltar um elemento de Quiz com o número certo de filhos, mas eles são todos os elementos filhos, e eles estão todos vazios .

Existe uma boa maneira de fazer este trabalho, curta de apenas retornar XML como uma String?

Antes que alguém pergunta, devido a circunstâncias fora do meu controle, eu não posso usar JAX-WS.

Foi útil?

Solução

Eu não acho suportes JAX-RPC polimorfismo dessa forma. Eu tive um problema semelhante, e teve que trabalhar em torno dele, criando uma classe que tinha apenas dois membros - um para cada uma das duas classes que poderiam ser devolvidos - e só preencher um, dependendo do tipo eu queria voltar. Assim, no seu caso:

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
}

O que requer o cliente para verificar qual membro da criança é preenchida, e é terrivelmente feia, eu sei.

Outras dicas

Talvez alguém ainda está olhando para ele, isso pode ser feito no eixo 1.4:

  1. Adicionar linha seguinte em sua seção do eixo arquivo de implantação do serviço web (WSDD):

    <parameter name="emitAllTypesInWSDL" value="true" />
    
  2. Modificar a sua tarefa no arquivo de construção Ant para incluir 'extraClasses':

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

    extraClasses Em mencionar todas as classes que serão passados, desde eixo não são capazes de adivinhar qual childs você estará passando / retornando como parâmetros.

Feito, aulas de agora você pode passar Derivados nos métodos aceita classes pai. Etc:

// 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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top