Конструктор без аргументов для класса, используемого в JAX-WS SEI - PullRequest
0 голосов
/ 07 декабря 2011

Я занимаюсь разработкой небольшого веб-сервиса и столкнулся с деталями, которые мне не понятны.

Это часть моего интерфейса конечной точки сервиса:

@WebService
public interface ScriptStarterInterface {
  String getResult(@WebParam(name="newFile") FileContainer newFile);
}

Существует реализацияоб этом тоже.;)
Теперь, когда я запускал сервер, возникла следующая исключительная ситуация:

Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
some.package.FileContainer does not have a no-arg default constructor.

Я добавил конструктор no-arg в FileContainer, и теперь все работает нормально.Что я не понимаю, так это: Почему я должен предоставить этот конструктор?

Все страницы оракула, на которые я наткнулся, просто говорят, что я должен предоставить один, но никогда почему.(

1 Ответ

1 голос
/ 13 декабря 2011

Конструктор без аргументов необходим, потому что JAXB создает экземпляры объектов, используя метод newInstance() из java.lang.Class, который не позволяет указывать аргументы. (Мы можем знать, что проблема связана с JAXB из-за имени пакета этого исключения.) Хотя можно создавать экземпляры объектов, получая соответствующий экземпляр java.lang.reflect.Constructor и затем предоставляя правильные аргументы, это гораздо сложнее и так обычно зарезервировано для очень сложных структур (например, Spring). Простой код использует простой API, который требует конструктора без аргументов; этого достаточно для большинства случаев, когда вы все равно хотите программно создавать объекты (а для JAXB сложные случаи решаются путем регистрации фабричных объектов, которые сами должны иметь конструкторы без аргументов, но которые могут создавать объекты с гораздо большей сложностью ).

...