在我寫一個REST服務器通用的,我有一個包單品數的集合類從我的服務返回:做一個集合的javax.xml.bind
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "person_collection")
public final class PersonCollection {
@XmlElement(name = "person")
protected final List<Person> collection = new ArrayList<Person>();
public List<Person> getCollection() {
return collection;
}
}
我想重構這些使用泛型這樣的樣板代碼可以在超類中實現:
public abstract class AbstractCollection<T> {
protected final List<T> collection = new ArrayList<T>();
public List<T> getCollection() {
return collection;
}
}
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "person_collection")
public final class PersonCollection extends AbstractCollection<Person> {}
如何設置在超集合@XmlElement
註解?我正在考慮一些涉及@XmlJavaTypeAdapter
和反思的內容,但希望更簡單些。如何創建JAXBContext
?順便說一下,我正在爲JAX-RS前端使用RestEasy 1.2.1 GA。
UPDATE(安德魯白色):這裏是代碼演示獲取Class
對象類型參數(一個或多個):
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.List;
public class TestReflection
extends AbstractCollection<String> {
public static void main(final String[] args) {
final TestReflection testReflection = new TestReflection();
final Class<?> cls = testReflection.getClass();
final Type[] types = ((ParameterizedType) cls.getGenericSuperclass()).getActualTypeArguments();
for (final Type t : types) {
final Class<?> typeVariable = (Class<?>) t;
System.out.println(typeVariable.getCanonicalName());
}
}
}
class AbstractCollection<T> {
protected List<T> collection = new ArrayList<T>();
}
這裏是輸出:java.lang.String
。
您不必在'@ XmlElement'上指定'name'屬性,因此您可以將'@ XmlElement'添加到'AbstractCollection.collection'中,並讓JAXB推斷出元素名稱。 – skaffman 2011-03-23 11:14:33
@skaffman:它不工作。我得到了一個'javax.xml.bind.JAXBException:class com.example.Person,但是它的任何超類都不知道這個上下文嗎? – Ralph 2011-03-23 12:19:33
那麼這是你創建JAXB上下文的錯誤。將其添加到您的問題中,我將發佈答案。 – skaffman 2011-03-23 12:38:44