将ExtJS与JAX-RS集成

时间:2011-02-28 14:15:35

标签: java extjs jersey jax-rs

我正在尝试将ExtJS与JAX-RS集成。我用POJOMappingFeature设置Jersey,它工作正常。但我想摆脱胶水代码。每个班级现在看起来像这样:

@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
}

这使扩展的classess干净且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来做得更好。

2 个答案:

答案 0 :(得分:2)

如果我理解了这个问题,你需要进入路径参数。

您可以使用子类中的类级路径参数变量来执行此操作,如:

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

    @PathParam("anotherId")
    private String anotherId;

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

答案 1 :(得分:0)

如果对于某些REST方法,您需要读取额外的参数,那么您可以添加到基类字段

@Context保护HttpServletRequest请求;

@Context protected UriInfo uriInfo;

并从路径获取所需的值,例如来自request.getPathInfo()。你需要自己解析路径,这不是特别好的代码片段,但这样你就可以使你的基本抽象类非常通用。