Search code examples
httpgwtjettyrestletresteasy

RESTeasy back-end - Restlet front-end : response entity null


I have some REST services on my server (Jetty, RESTeasy) and a GWT client. I choosed to use Restlet-GWT module on the front end.

I made a JSE client (RESTeasy client) and my service is well called (i see SQL trace in the log of Jetty server) and i get an xml response.

Then i tried from GWT with Restlet. The web service is called (Jetty log) but i have a null response.

Web service (Back end):

@GET
@Path("/getArt/{id}")
@Produces("application/xml")
public Art getArt(@PathParam("id")int id){
    Art art= artDAO.findById(id);
    return art;
}

Front-end GWT :

public class Front_End implements EntryPoint {

/**
 * This is the entry point method.
 */
public void onModuleLoad() {    
final Client client = new Client(Protocol.HTTP);
client.get("http://localhost:8080/rest/service/getArt/1", new Callback() {
    @Override
    public void onEvent(Request request, Response response) {

        System.out.println("Reponse : " + response.getEntity().getText());
    }
});
}

RESTeasy client working :

public Object test(int id){
    try {

        ClientRequest request = new ClientRequest("http://localhost:8080/rest/service/getArt/"+id);

        request.accept("application/xml");
        ClientResponse<String> response = request.get(String.class);

        if (response.getStatus() == 200) 
        {
            Unmarshaller un = jc.createUnmarshaller();
            Object o = un.unmarshal(new StringReader(response.getEntity()));
            return o;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

Are RESTeasy and Restlet "compatible" ? Should i use Restlet in the back end instead of RESTeasy ? What am i missing ?

Thx in advance


Solution

  • It was a SOP issue. My server was running on port 8080, and GWT on port 8888.

    I used a proxy (put it in your /war in the client side) :

    proxy.jsp

    <%@page import="javax.naming.Context"%>
    <%@page import="javax.naming.InitialContext"%><%@page session="false"%>
    <%@page import="java.net.*,java.io.*" %>
    
    <%
    try {
    String reqUrl = request.getQueryString();
    URL url = new URL(reqUrl.substring(4));
    
    HttpURLConnection con = (HttpURLConnection)url.openConnection();
    con.setDoOutput(true);
    con.setRequestMethod(request.getMethod());
    int clength = request.getContentLength();
    if (clength > 0) {
        con.setDoInput(true);
        byte[] idata = new byte[clength];
        request.getInputStream().read(idata,0,clength);
        con.getOutputStream().write(idata,0,clength);
    }
    response.setContentType(con.getContentType());
    BufferedReader rd = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null) {
        out.println(line);
    }
    rd.close();
    } catch (Exception e) {
        e.printStackTrace();
        response.setStatus(500);
    }
    %>
    

    then in your class where you make the call, your url becomes :

    String url ="proxy.jsp?url=" + URL.encode("http://localhost:8080/rest/service/getArt/1");
    

    There is another way to solve it, check https://developers.google.com/web-toolkit/doc/1.6/tutorial/Xsite