wsgen: mengembalikan kelas abstrak

Saya menulis kelas abstrak

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

dan dua kelas turunan:

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";}
    }

dan @layanan web:

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());

        }
    }

Ketika kode dibuat menggunakan wsgen, skema XML yang dihasilkan hanya berisi definisi untuk kelas abstrak Induk tetapi tidak untuk Anak1 atau Anak2. Apakah ada cara untuk memberitahu wsgen untuk menghasilkan definisi untuk dua kelas konkret?

Terima kasih,


person Pierre    schedule 14.02.2012    source sumber


Jawaban (1)


Menambahkan anotasi @XmlSeeAlso seharusnya berhasil:

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

Jika Anda memilih untuk tidak membuat kelas induk mengetahui subkelasnya, Anda juga dapat meletakkan anotasi tersebut di tingkat 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());
    }
}

Informasi menarik tentang perilaku ini dapat Anda temukan di sini

person Łukasz Rżanek    schedule 14.02.2012