【发布时间】:2015-04-01 18:56:35
【问题描述】:
我有一个简单的类似 REST 的服务,在 JAX-RS 中实现以维护 Foo 的。它使用POST foos 创建foo,使用GET foos 列出foo,并使用GET foo/42 详细说明给定的foo(其中42 是给定的foo 的id)。
public class FooService {
@POST
@Path("/foos")
public Foo create(Foo foo){
entityManager.getTransaction().begin();
entityManager.persist(foo);
entityManager.getTransaction().commit();
return foo;
}
@GET
@Path("/foos")
public List<Foo> get(){
List<Foo> foos = //more-or-less generic JPA querying-code
return foos;
}
@GET
@Path("/foos/{id}")
public Foo get(@PathParam("id") int id){
Foo foo = //more-or-less generic JPA querying-code
return foo;
}
}
现在,如果我也有维护Bar 的类似服务,我应该如何优雅地避免代码重复?
public class BarService {
@POST
@Path("/bars")
public Bar create(Bar bar){
entityManager.getTransaction().begin();
entityManager.persist(bar);
entityManager.getTransaction().commit();
return bar;
}
@GET
@Path("/bars")
public List<Bar> get(){
List<Bar> bars = //more-or-less generic JPA querying-code
return bars;
}
@GET
@Path("/bars/{id}")
public Bar get(@PathParam("id") int id){
Bar bar = //more-or-less generic JPA querying-code
return bar;
}
}
唯一的区别是@Path 注释中指定的路径 值。由于该值应该是静态的(在编译时可见),因此无法创建 AbstracService 类,例如:
public abstract class AbstracService<X> {
//abstrac static is not possible
public abstract static final String PATH;
@POST
@Path(PATH)
public X create(X entity){ ... }
@GET
@Path(PATH)
public List<X> get(){ ... }
@GET
@Path(PATH + "/{id}")
public X get(@PathParam("id") int id){ ... }
}
public class FooService extends AbstractService<Foo>{
//just override the PATH to be "foos"
}
public class BarService extends AbstractService<Bar>{
//just override the PATH to be "bars"
}
我是否需要重写每个服务方法来调整@Path 并且他们调用supers 实现?
上面的类FooService 和BarService 太相似了,无法让我的可重用性保持沉默。
【问题讨论】:
标签: java web-services rest jax-rs reusability