Почему конструктор по умолчанию требуется для объектов, экспортируемых JAX-WS?
JAX-WS требует, чтобы все передаваемые классы имели конструктор по умолчанию (конструктор без аргументов). Я не понимаю этого требования, потому что клиенты создают свои собственные классы на основе WSDL. ИМО это требование имеет смысл только для тех классов, которые используются в качестве входных параметров веб-сервиса.
Кто-нибудь знает, как обойти это требование?
2 ответа
Когда вы используете JAX-WS, вы используете реализацию JAXB для сериализации ваших java-объектов в XML.
Итак, "проблема" в том, как работает JAXB.
Чтобы использовать JAXB, вам нужно создать JAXBContext, передав ему все классы, которые можно маршалировать / не маршалировать. При создании контекста JAXB проверит, что все указанные классы имеют конструктор без аргументов. Если хотя бы один из этих классов не имеет конструктора такого типа, контекст не будет создан.
Почему JAXB это делает? Этот конструктор без аргументов нужен ТОЛЬКО при преобразовании из XML в Object (демаршаллинг), но проблема в том, что когда вы создаете контекст, JAXB не знает, что вы хотите сделать (маршал или демаршал)!
Вывод: JAXB будет принимать только те классы, которые он может собирать и отменять. Больше информации здесь
Зная это, что происходит в JAX-WS?
Когда вы объявляете @WebMethod
параметры и классы возвращаемых значений будут добавлены в контекст JAXB. И из-за этого все классы, связанные с вводом и выводом веб-сервиса, нуждаются в конструкторе без аргументов.
Вывод: виноват JAXB;-)
Но что, если мне нужно использовать класс, у которого нет конструктора без аргументов?
Вы можете использовать XMLAdapter! Проверьте этот пост для получения дополнительной информации...
Кто-нибудь знает, как обойти это требование?
Да - переписать JAX-WS.
Вероятно, он использует ctor и отражение по умолчанию для заполнения объектов, потому что он не может легко узнать о каждом возможном ctor, который может написать кто-то вроде вас.
Это недостаток использования чужих фреймворков: вы должны играть по их правилам.
клиенты создают свои собственные классы на основе WSDL
Я думал, что это то, что библиотека помогла клиентам сделать. Вы не написали код для разбора и интерпретации WSDL?