Polimorfismo em serviços da Web JAX-RPC
-
05-07-2019 - |
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.
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:
-
Adicionar linha seguinte em sua seção do eixo arquivo de implantação do serviço web (WSDD):
<parameter name="emitAllTypesInWSDL" value="true" />
-
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.