Интеграция ExtJS с JAX-RS - PullRequest
       8

Интеграция ExtJS с JAX-RS

3 голосов
/ 28 февраля 2011

Я пытаюсь интегрировать 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, чтобы сделать это лучше.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2012

Если я понимаю вопрос, вам нужно перейти к параметру пути.

Вы можете сделать это, используя переменную параметра пути уровня класса в вашем подклассе, например:

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

    @PathParam("anotherId")
    private String anotherId;

    @GET
    public String hello() {
        return anotherId;
    }
}
0 голосов
/ 12 апреля 2012

Если для какого-либо метода REST вам нужно прочитать дополнительные параметры, то вы можете добавить в поле базового класса

@ Запрос HttpServletRequest с защитой контекста;

или

@ Контекст защищен UriInfo uriInfo;

и получите требуемое значение из пути, например, из request.getPathInfo (). Вам нужно будет самостоятельно проанализировать путь, что не очень удобно, но таким образом вы можете сделать базовый абстрактный класс очень универсальным.

...