我正在嘗試將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來更好地實現它。
自你的問題已經過了一年。最後選擇了什麼? – husayt 2012-04-11 15:33:00
我們回到了使用Struts 2。 – piotrek 2012-04-13 08:46:03