RESTEasy не может вызвать мой аннотированный метод в классе scala - PullRequest
1 голос
/ 22 апреля 2011

Попытка реализовать ресурс JAX-RS в Scala.Моя Java-версия имеет следующую сигнатуру типа:

@GET
@Path(value="echoold")
@Produces("application/json")
public Map<String,Object> get(
        @QueryParam("param") String param,
        @QueryParam("asOf") @DefaultValue(NOW) DateWrapper asOf,
        @QueryParam("httpError") @DefaultValue("200") int httpError,
        @QueryParam("httpErrorMessage") @DefaultValue("") String httpErrorMessage,
        @QueryParam("fail") @DefaultValue("false") boolean fail) {

Таким образом, версия Scala:

@GET
@Path(value="echo")
@Produces(Array("application/json"))
def get() = {
        @QueryParam("param") param:String,
        @QueryParam("asOf") @DefaultValue(NOW) asOf:DateWrapper,
        @QueryParam("httpError") @DefaultValue("200") httpError:java.lang.Integer,
        @QueryParam("httpErrorMessage") @DefaultValue("") httpErrorMessage:String,
        @QueryParam("fail") @DefaultValue("false") fail:java.lang.Boolean):java.util.Map[String,Object] = {

Когда я запускаю свое приложение, я получаю эту странную ошибку от RESTEasy (который я отформатировал для удобства чтения):

org.jboss.resteasy.spi.InternalServerErrorException: 
    Bad arguments passed to 
        public java.util.Map opower.api.endpoint.echo.Echo.get(java.lang.String,
                                                               opower.api.support.DateWrapper,
                                                               java.lang.Integer,
                                                               java.lang.String,
                                                               java.lang.Boolean)  
        ( java.lang.String someValue, 
          opower.api.support.DateWrapper opower.api.support.DateWrapper@28a34522, 
          java.lang.Integer 400, 
          java.lang.String This is the message, 
          java.lang.Boolean false )

Основное исключение:

Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140)

Теперь этот класс настроен через Spring, поэтому он может быть каким-то сумасшедшим прокси-классом, и он портится, но кто-нибудь еще видел что-то подобное?

(Если вы не знаете, что делает RESTEasy / JAX-RS, в основном контейнер (RESTEasy) находит методына классы, в которых есть эти аннотации, а затем вызывает их при достижении определенных конечных точек URL)

1 Ответ

0 голосов
/ 09 декабря 2011

У меня было то же самое с Spring / Scala и аннотацией метода @Transactional.

необходимо изменить прокси-целевой класс в

<tx:annotation-driven transaction-manager="txManager" 
          mode="proxy" proxy-target-class="true"/>

Значение по умолчанию для proxy-target-class равно false. Требуется cglib в classpath.

Я думаю, mode = "acpectj" также может работать (не пытался)

...