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 ที่ได้จะมีเฉพาะคำจำกัดความสำหรับคลาสนามธรรม พาเรนต์ แต่ไม่ใช่สำหรับ Child1 หรือ เด็ก2. มีวิธีใดบ้างที่จะบอก wsgen ให้สร้างคำจำกัดความสำหรับคลาสที่เป็นรูปธรรมทั้งสองคลาส?

ขอบคุณ,


person Pierre    schedule 14.02.2012    source แหล่งที่มา


คำตอบ (1)


การเพิ่มคำอธิบายประกอบ @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());
    }
}

ข้อมูลที่น่าสนใจเกี่ยวกับพฤติกรรมนี้ คุณสามารถดูได้ที่นี่

person Łukasz Rżanek    schedule 14.02.2012