2011-04-21 112 views
1

試圖在Scala中實現JAX-RS資源。這個我的Java版本具有以下類型簽名:RESTEasy無法在scala類上調用我的註釋方法

@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) { 

斯卡拉版本是這樣的:

@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 [email protected], 
      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端點命中)

回答

0

我和Spring/Scala和@Transactional方法註解一樣。

需要改變代理目標類

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

默認值進行代理目標類是假的。它需要類路徑中的cglib。

我猜mode =「acpectj」也可以工作(沒試試)