Java.util.List - это интерфейс, и JAXB не может обрабатывать интерфейсы
Попытка развернуть мое приложение показалось мне следующим:
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
java.util.List is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at java.util.List
at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return
at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse
java.util.List does not have a no-arg default constructor.
this problem is related to the following location:
at java.util.List
at private java.util.List foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse._return
at foobar.alkohol.register.webservice.jaxws.GetRelationsFromPersonResponse
Мой код работал очень хорошо, пока я не изменил тип возврата из списка в список < List <RelationCanonical → →
Вот частичный веб-сервис:
@Name("relationService")
@Stateless
@WebService(name = "RelationService", serviceName = "RelationService")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED)
public class RelationService implements RelationServiceLocal {
private boolean login(String username, String password) {
Identity.instance().setUsername(username);
Identity.instance().setPassword(password);
Identity.instance().login();
return Identity.instance().isLoggedIn();
}
private boolean logout() {
Identity.instance().logout();
return !Identity.instance().isLoggedIn();
}
@WebMethod
public List<List<RelationCanonical>> getRelationsFromPerson(@WebParam(name = "username")
String username, @WebParam(name = "password")
String password, @WebParam(name = "foedselsnummer")
String... foedselsnummer) {
......
......
......
}
Я также попытался удалить @SOAPBinding и попробовать по умолчанию, но тот же результат.
Оцените любую помощь
UPDATE
Хочу кое-что отметить. Я изменил все List на ArrayList, а затем скомпилировал. Причина, по которой я говорю, скомпилирована и не работает, связана с тем, что она ведет себя странно. Я получаю объект типа:
RelationServiceStub.ArrayList
но объект не имеет методов получения или не ведет себя как список. Я также попытался передать его в список, но это не сработало.
Обратите внимание, что это после того, как я использовал Axis 2 и wsdl2java. Так что да, теперь он компилируется, но я не знаю, как получить данные.
Ответы
Ответ 1
В моем понимании, вы не сможете обрабатывать простой List
через JAXB, поскольку JAXB не имеет понятия, как преобразовать его в XML.
Вместо этого вам нужно будет определить тип JAXB, который содержит List<RelationCanonical>
(я назову его Type1
), а другой - для хранения списка этих типов (в свою очередь (поскольку вы имеете дело с a List<List<...>>
; я назову этот тип Type2
).
Результатом может быть XML-выход таким образом:
<Type2 ...>
<Type1 ...>
<RelationCanonical ...> ... </RelationCanonical>
<RelationCanonical ...> ... </RelationCanonical>
...
</Type1>
<Type1>
<RelationCanonical ...> ... </RelationCanonical>
<RelationCanonical ...> ... </RelationCanonical>
...
</Type1>
...
</Type2>
Без двух охватывающих JAXB-аннотированных типов процессор JAXB не имеет представления о том, какую разметку нужно генерировать, и, следовательно, не удается.
- Изменить:
То, что я имею в виду, должно выглядеть примерно так:
@XmlType
public class Type1{
private List<RelationCanonical> relations;
@XmlElement
public List<RelationCanonical> getRelations(){
return this.relations;
}
public void setRelations(List<RelationCanonical> relations){
this.relations = relations;
}
}
и
@XmlRootElement
public class Type2{
private List<Type1> type1s;
@XmlElement
public List<Type1> getType1s(){
return this.type1s;
}
public void setType1s(List<Type1> type1s){
this.type1s= type1s;
}
}
Вы также должны проверить раздел JAXB в учебнике J5EE и Неофициальное руководство JAXB.
Ответ 2
Если это соответствует вашей цели, вы всегда можете определить такой массив:
YourType[]
JAXB, безусловно, может понять, что это такое, и вы должны иметь возможность мгновенно использовать его на стороне клиента. Я бы также рекомендовал вам сделать это таким образом, так как вы не сможете изменять массив, полученный с сервера через список, но с помощью методов, предоставляемых веб-службой
Ответ 3
Если вы хотите сделать это для любого класса.
return items.size() > 0 ? items.toArray((Object[]) Array.newInstance(
items.get(0).getClass(), 0)) : new Object[0];
Ответ 4
Вместо внутреннего "списка" вы можете использовать "ArrayList"