2012-02-14 4 views
2

Я написал абстрактный классwsgen: возвращение абстрактный класс

import javax.xml.bind.annotation.*; 
public abstract class Parent 
    { 
    @XmlAttribute(name = "one") 
    public String getOne() { return "one";} 
    } 

и два производных:

import javax.xml.bind.annotation.*; 
@XmlRootElement(name="child1") 
public class Child1 extends Parent 
    { 
    @XmlAttribute(name = "two") 
    public String getTwo() { return "2";} 
    } 



import javax.xml.bind.annotation.*; 
@XmlRootElement(name="child2") 
public class Child2 extends Parent 
    { 
    @XmlAttribute(name = "three") 
    public String getThree() { return "3";} 
    } 

и @WebService:

import javax.xml.ws.Endpoint; 
import javax.jws.*; 
import java.util.*; 

@WebService(serviceName="MyServerService", name="MyServer") 
public class MyServer 
    { 
     private int count=0; 
    @WebResult(name="test") 
     @WebMethod 
    public Parent getOne() { return ++count%2==0?new Child1():new Child2();} 

    public static void main(String[] args) { 

     Endpoint.publish(
      "http://localhost:8080/path", 
      new MyServer()); 

     } 
    } 

Когда генерируется код используя wsgen, результирующая XML-схема содержит только определение абстрактного класса Родитель, но не для Ребенок1 или Child2. Есть ли способ сказать wsgen для генерации определения для двух конкретных классов?

Спасибо,

ответ

3

Добавление аннотаций @XmlSeeAlso следует сделать трюк:

@XmlSeeAlso({Child1.class, Child2.class}) 
public abstract class Parent { 
    @XmlAttribute(name = "one") 
    public String getOne() { 
     return "one"; 
    } 
} 

Если вы предпочитаете не делать родительский класс в курсе его подклассов вы можете поместить эту аннотацию на уровне WS, а также:

@WebService(serviceName="MyServerService", name="MyServer") 
@XmlSeeAlso({Child1.class, Child2.class}) 
public class MyServer { 
    private int count=0; 

    @WebResult(name="test") 
    @WebMethod 
    public Parent getOne() { 
     return ++count%2==0?new Child1():new Child2(); 
    } 

    public static void main(String[] args) { 
     Endpoint.publish("http://localhost:8080/path", new MyServer()); 
    } 
} 

Интересная информация об этом поведении вы можете найти here

Смежные вопросы