2016-05-09 4 views
0

Errai 4.0.0.Beta1を使用していて、簡単なJAX RSコールを作成しようとしています。ClassCastException ErraiでJAXRSコールを作成しようとしたとき4

final RemoteCallback<List<Company>> remoteCallback = new RemoteCallback<List<Company>>() { 
    @Override 
    public void callback(List<Company> companies) { 
    Window.alert("rpcServiceCaller - Callback"); 
    Window.alert("Number of companies returned: " + companies.size()); 
    } 
}; 
final RestErrorCallback errorCallback = new RestErrorCallback() { 
    @Override 
    public boolean error(Request message, Throwable throwable) { 
    Window.alert(throwable.getMessage()); 
    logger.error(throwable.getMessage(), throwable); 
    return false; 
    } 
}; 
RestClient.create(ErraiJAXRSService.class, 
    remoteCallback, 
    errorCallback, 
    200).getCompaniesJSON(); 

私はスーパーのDevモードで次の例外が見ています:プロキシが返され

Error caused by: ClassCastException: undefined 
    at f9b_g$ [as collect_0_g$] (StackTraceCreator.java:198) 
    at H8b_g$ (StackTraceCreator.java:343) 
    at Iz_g$ [as fillInStackTrace_0_g$] (Throwable.java:114) 
    at Bz_g$ (Throwable.java:53) 
    at Xz_g$ (Exception.java:25) 
    at cA_g$ (RuntimeException.java:25) 
    at Ymb_g$ (ClassCastException.java:23) 
    at Mzg_g$ (InternalPreconditions.java:45) 
    at Xzg_g$ (InternalPreconditions.java:33) 
    at n1d_g$ (Cast.java:75) 
    at rrh_g$ (RestClient.java:192) 
    at srh_g$ (RestClient.java:158) 
    at wrh_g$ (RestClient.java:113) 
    at ynf_g$ [as erraiJSON_0_g$] (JAXRSPage.java:94) 
    at gKh_g$ [as onClick_0_g$] (Type_factory__c_i_e_c_j_JAXRSPage__quals__j_e_i_Any_j_e_i_Default.java:76) 
    at Exd_g$ [as dispatch_4_g$] (ClickEvent.java:56) 
    at Fxd_g$ [as dispatch_1_g$] (ClickEvent.java:55) 
    at Awd_g$ [as dispatch_0_g$] (GwtEvent.java:76) 
    at ZGd_g$ (EventBus.java:40) 
    at iHd_g$ [as doFire_0_g$] (SimpleEventBus.java:193) 
    at oHd_g$ [as fireEvent_2_g$] (SimpleEventBus.java:88) 
    at RGd_g$ [as fireEvent_1_g$] (HandlerManager.java:127) 
    at Lve_g$ [as fireEvent_1_g$] (Widget.java:129) 
    at Lwd_g$ (DomEvent.java:125) 
    at Tve_g$ [as onBrowserEvent_0_g$] (Widget.java:177) 
    at gne_g$ (DOM.java:1480) 
    at fne_g$ (DOM.java:1419) 
    at HTMLButtonElement.xte_g$ (DOMImplStandard.java:317) 
    at k6b_g$ (Impl.java:233) 
    at n6b_g$ (Impl.java:285) 
    at HTMLButtonElement.<anonymous> (Impl.java:71) 

を、それをキャストしようとする任意の行ここで

は、私が使用していたコードですAbstractJaxrsProxyへのアクセスは、上記の例外で失敗します。

JaxrsProxyLoaderImpl.javaが作成されている、と私のJAX RSサービスがあります:

package org.jboss.errai.enterprise.client.jaxrs; 

import com.google.gwt.http.client.RequestBuilder; 
import com.insclix.erraiPOC.shared.domain.Company; 
import com.insclix.erraiPOC.shared.service.jaxrs.ErraiJAXRSService; 
import java.util.List; 
import org.jboss.errai.common.client.api.ErrorCallback; 
import org.jboss.errai.common.client.api.RemoteCallback; 
import org.jboss.errai.common.client.framework.ProxyProvider; 
import org.jboss.errai.common.client.framework.RemoteServiceProxyFactory; 
import org.jboss.errai.security.client.local.interceptors.SecurityExceptionMapper; 

public class JaxrsProxyLoaderImpl implements JaxrsProxyLoader { public void loadProxies() { 
    class com_insclix_erraiPOC_shared_service_jaxrs_ErraiJAXRSServiceImpl extends AbstractJaxrsProxy implements ErraiJAXRSService { 
    private RemoteCallback remoteCallback; 
    private ErrorCallback errorCallback; 
    public com_insclix_erraiPOC_shared_service_jaxrs_ErraiJAXRSServiceImpl() { 
    setExceptionMapper(new SecurityExceptionMapper()); 
    } 

    public RemoteCallback getRemoteCallback() { 
    return remoteCallback; 
    } 

    public void setRemoteCallback(RemoteCallback callback) { 
    remoteCallback = callback; 
    } 

    public ErrorCallback getErrorCallback() { 
    return errorCallback; 
    } 

    public void setErrorCallback(ErrorCallback callback) { 
    errorCallback = callback; 
    } 

    public List getCompaniesJSON() { 
    StringBuilder url = new StringBuilder(getBaseUrl()); 
    url.append("company/jaxrs"); 
    RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url.toString()); 
    requestBuilder.setHeader("Accept", "application/json"); 
    sendRequest(requestBuilder, null, new ResponseDemarshallingCallback() { 
    public Object demarshallResponse(String response) { 
    return MarshallingWrapper.fromJSON(response, List.class, Company.class); 
    } 
    }); 
    return null; 
    } 

    public List getCompaniesXML() { 
    StringBuilder url = new StringBuilder(getBaseUrl()); 
    url.append("company/jaxrs"); 
    RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.GET, url.toString()); 
    requestBuilder.setHeader("Accept", "application/xml"); 
    sendRequest(requestBuilder, null, new ResponseDemarshallingCallback() { 
    public Object demarshallResponse(String response) { 
    return MarshallingWrapper.fromJSON(response, List.class, Company.class); 
    } 
    }); 
    return null; 
    } 

    public Long createCompanyJSON(final Company a0) { 
    StringBuilder url = new StringBuilder(getBaseUrl()); 
    url.append("company/jaxrs"); 
    RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST, url.toString()); 
    requestBuilder.setHeader("Content-Type", "application/json"); 
    sendRequest(requestBuilder, MarshallingWrapper.toJSON(a0), new ResponseDemarshallingCallback() { 
    public Object demarshallResponse(String response) { 
    return MarshallingWrapper.fromJSON(response, Long.class, null); 
    } 
    }); 
    return 0L; 
    } 

    public Long createCompanyXML(final Company a0) { 
    StringBuilder url = new StringBuilder(getBaseUrl()); 
    url.append("company/jaxrs"); 
    RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST, url.toString()); 
    requestBuilder.setHeader("Content-Type", "application/xml"); 
    sendRequest(requestBuilder, MarshallingWrapper.toJSON(a0), new ResponseDemarshallingCallback() { 
    public Object demarshallResponse(String response) { 
    return MarshallingWrapper.fromJSON(response, Long.class, null); 
    } 
    }); 
    return 0L; 
    } 
    } 
    RemoteServiceProxyFactory.addRemoteProxy(ErraiJAXRSService.class, new ProxyProvider() { 
    public Object getProxy() { 
    return new com_insclix_erraiPOC_shared_service_jaxrs_ErraiJAXRSServiceImpl(); 
    } 
    }); 
    } 
} 

答えて

1

これは、JAX-RS/Erraiクラスとインターフェイスが設定された方法に問題があることが判明しました。 JAX-RS仕様によれば、@Path注釈は実装上にある必要がありますが、Erraiはインタフェース上でそれを必要とします。

したがって、解決策はインターフェイス(Errai用)とそれを実装するクラス(JAX-RS用)の両方に@Path注釈を付けることでした。

注釈がインターフェイス上にある場合、Wildflyはこれを許可し、Jerseyはインターフェイスを無視します(ResteasyServletInitializerを実行している場合)