我正在尝试将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来做得更好。
答案 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()。你需要自己解析路径,这不是特别好的代码片段,但这样你就可以使你的基本抽象类非常通用。