2011-02-28 105 views
3

我正在嘗試將ExtJS與JAX-RS集成。我用POJOMappingFeature設置了Jersey,並且它工作正常。但我想擺脫膠水代碼。每類現在看起來是這樣的:將ExtJS與JAX-RS集成

@Path("/helloworld") 
public class A { 

    @POST 
    @Produces(MediaType.APPLICATION_JSON) 
    public final ExtJsRestOutput createAction(ExtJsRestInput<B> toCreate) { 
     try { 
      final B created = toCreate.getData(); 
      // logic 
      return new ExtJsRestDataOutput<B>(created); 
     } catch (Exception e) { 
      return new ExtJsRestFailure(); 
     } 
    } 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public final ExtJsRestOutput readCollectionAction() { 
     try { 
      final List<B> readCollection; 
      //logic 
      return new ExtJsRestDataOutput<List<B>>(readCollection); 
     } catch (Exception e) { 
      return new ExtJsRestFailure(); 
     } 
    } 

    @PUT 
    @Path("{id}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public final ExtJsRestOutput updateAction(ExtJsRestInput<B> toUpdate) { 
     try { 
      final B udpated = toUpdate.getData(); 
      // logic 
      return new ExtJsRestDataOutput<B>(udpated); 
     } catch (Exception e) { 
      return new ExtJsRestFailure(); 
     } 
    } 

    @GET 
    @Path("{id}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public final ExtJsRestOutput readAction(@PathParam("id") Integer id) { 
     try { 
      final T read; 
      // logic 
      return new ExtJsRestDataOutput<B>(read); 
     } catch (Exception e) { 
      return new ExtJsRestFailure(); 
     } 
    } 

    @DELETE 
    @Path("{id}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public final ExtJsRestOutput deleteAction(@PathParam("id") Integer id) { 
     try { 
      // logic 
      return new ExtJsRestSuccess(); 
     } catch (Exception e) { 
      return new ExtJsRestFailure(); 
     } 
    } 
} 

我試着用繼承來解決這個問題,而且它轉向類似的東西:

public abstract class ExtJsRestAction<T> { 

    @GET 
    @Path("{id}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public final ExtJsRestOutput readAction(@PathParam("id") Integer id) { 
     try { 
      final T read = read(id); 
      return new ExtJsRestDataOutput<T>(read); 
     } catch (Exception e) { 
      LOG.error("blad wywolania read", e); 
      return new ExtJsRestFailure("FAIL"); 
     } 
    } 

    abstract public T read(Integer id) throws Exception; 

    // ... similar for the other methods 
} 

這使得擴展類新的清潔和ExtJS的不可知:

@Path("/helloworld") 
public class BAction extends ExtJsRestAction<B> { 
    B create(B toCreate){ 
     // logic 
    } 

    B read(Integer id){ 
     // logic 
    } 

    // and so on...  
} 

這將是相當不錯的,但是當路徑看起來像這樣有問題:

@Path("/helloworld/{anotherId}") 

沒有(簡單)訪問anotherId的方法。

我不知道應該尋找解決方案。有什麼辦法可以編寫一個攔截器類,而不是這個基類,它會打包/解壓縮ExtJS的對象?或者,也許你可以推薦一個更好的解決方案來整合ExtJS和Java。我使用的是Struts 2,當我添加一個自定義的攔截器時,它在JSON上工作得很好,但我希望能夠使用JAX-RS API來更好地實現它。

+0

自你的問題已經過了一年。最後選擇了什麼? – husayt 2012-04-11 15:33:00

+0

我們回到了使用Struts 2。 – piotrek 2012-04-13 08:46:03

回答

2

如果我明白了這個問題,你需要進入路徑參數。

你可以這樣做,用你的子類像一個一流水平的路徑PARAM變量:

@Path("/helloworld/{anotherId}") 
public class SubClass { 

    @PathParam("anotherId") 
    private String anotherId; 

    @GET 
    public String hello() { 
     return anotherId; 
    } 
} 
0

如果你需要閱讀額外的參數一些REST方法,那麼你可能會添加到您的基類領域

@Context受保護的HttpServletRequest請求;

@Context protected UriInfo uriInfo;

並從路徑獲得所需值,例如,來自request.getPathInfo()。你需要自己解析路徑,這不是特別好的一段代碼,但這樣你可以使你的基本抽象類非常通用。