Класс xxx не содержит публичного конструктора, необходимого для автоматического построения, когда xxx становится сервисом Tapestry.

Я открываю для себя замечательную интеграционную работу, проделанную командой Тинамо между Tapestry и Resteasy .

Я пытаюсь активировать Liveclass Reloading на веб-сервисах. Согласно документу говорит:

Документация

Единственное, что вам нужно сделать, чтобы включить перезагрузку классов в реальном времени для ваших REST-сервисов, это связать их как обычные сервисы IestC Tapestry и добавить их в javax.ws.rs.core.Application.class. Узнайте больше о том, как происходит перезагрузка реализации сервиса: http://tapestry.apache.org/reload.html

Вот пример из набора тестов гобелен-рестайзи.

public static void bind(ServiceBinder binder)
{
    binder.bind(ReloadableEchoResource.class, ReloadableEchoResourceImpl.class);
}

@Contribute(javax.ws.rs.core.Application.class)
public static void configureRestResources(Configuration<Object> singletons, ReloadableEchoResource reloadableEchoResource)
{
    singletons.add(reloadableEchoResource);
}

Моя собственная работа

Это именно то, что я делаю (ну... по крайней мере, я верю, что это так;D):

Мой переплет

public static void bind(ServiceBinder binder)
{
    binder.bind(PushMessageService.class, GCMPushMessageServiceImpl.class);
    binder.bind(UserService.class, HibernateUserServiceImpl.class);
    binder.bind(IUserResource.class, UserResourceImpl.class);

}

/**
 * Contributions to the RESTeasy main Application, insert all your RESTeasy singletons services here.
 */
@Contribute(javax.ws.rs.core.Application.class)
public static void configureRestResources(Configuration<Object> singletons, IUserResource userResource)
{
    singletons.add(userResource);
}

Мой интерфейс

@Path("/user")
public interface IUserResource {

    /**
     * Lecture de tous les utilisateurs
     * 
     * @return une List des utilisateurs existants
     */
    @GET
    @Produces("application/json")
    public abstract List<User> getAllDomains();

ошибка

Но когда я запускаю свое приложение, я получаю это сообщение:

HTTP ERROR 500

Problem accessing /user. Reason:

Exception constructing service 'ResteasyRequestFilter': Error building service proxy for service 'Application' (at org.tynamo.resteasy.Application(Collection) (at Application.java:14) via org.tynamo.resteasy.ResteasyModule.bind(ServiceBinder) (at ResteasyModule.java:31)): Error invoking service contribution method org.tynamo.resteasy.ResteasyModule.javaxWsRsCoreApplication(Configuration, ObjectLocator, ResteasyPackageManager, ClassNameLocator): Class com.sopragroup.ecommerce.mobile.rest.IUserResource does not contain a public constructor needed to autobuild.

Caused by:

java.lang.RuntimeException: Exception constructing service 'ResteasyRequestFilter': Error building service proxy for service 'Application' (at org.tynamo.resteasy.Application(Collection) (at Application.java:14) via org.tynamo.resteasy.ResteasyModule.bind(ServiceBinder) (at ResteasyModule.java:31)): Error invoking service contribution method org.tynamo.resteasy.ResteasyModule.javaxWsRsCoreApplication(Configuration, ObjectLocator, ResteasyPackageManager, ClassNameLocator): Class com.sopragroup.ecommerce.mobile.rest.IUserResource does not contain a public constructor needed to autobuild.
    at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.obtainObjectFromCreator(JustInTimeObjectCreator.java:75)
    at org.apache.tapestry5.ioc.internal.services.JustInTimeObjectCreator.createObject(JustInTimeObjectCreator.java:54)

Это похоже на то, что автоматическое связывание не работает (на самом деле я так думаю). Очевидно, что когда я пытаюсь без создания интерфейса и привязки, это работает как шарм.

Может кто-нибудь дать мне подсказку?

1 ответ

Решение

Я думаю, что проблема в том, что tapestry-resteasy пытается автоматически собрать IUserResource, потому что он находится в пакете rest.

Вот очень важная строка документации, которую вы, возможно, пропустили:

Еще одна вещь: НЕ помещайте эту услугу в пакет автообнаружения.

Это важная строка, и она была каким-то образом скрыта в документах, поэтому я добавил предупреждение, чтобы сделать его более заметным для будущих пользователей: http://docs.codehaus.org/pages/diffpagesbyversion.action?pageId=151847035&selectedPageVersions=24&selectedPageVersions=23

Другие вопросы по тегам