Я пытаюсь интегрировать ExtJS с JAX-RS.Я настроил Джерси с POJOMappingFeature, и он отлично работает.Но я хочу избавиться от клеевого кода.Каждый класс теперь выглядит следующим образом:
@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
}
Это делает расширяемый класс чистым и ExtJSagnostic:
@Path("/helloworld")
public class BAction extends ExtJsRestAction<B> {
B create(B toCreate){
// logic
}
B read(Integer id){
// logic
}
// and so on...
}
Это было бы неплохо, но есть проблемы, когда путь выглядит следующим образом:
@Path("/helloworld/{anotherId}")
Не существует (простого) способа доступа к другому идентификатору.
Я не знаю, где мне искать решение.Есть ли способ написать класс-перехватчик вместо этого базового класса, который бы упаковывал / распаковывал объекты для ExtJS?Или, может быть, вы могли бы порекомендовать лучшее решение для интеграции ExtJS с Java.Я использовал Struts 2, и он хорошо работал с JSON, когда я добавил пользовательский перехватчик, но я надеялся, что смогу использовать API JAX-RS, чтобы сделать это лучше.