匿名JAX-RS资源

时间:2014-05-28 08:39:30

标签: java jax-rs soa

我正在寻找在运行时(对于实体类)创建JAX-RS资源的任何可能性。通常这些类使用@Path("/<resource>")进行注释,以将它们标识为资源类。是否可以在运行时创建这些类,例如作为具有自定义路径的匿名类?

这里有一个关于它是什么样子的想法,而抽象服务是一个基础实现:

AnyType service = new AbstractService() {
  @Path("/<CustomResourceName>")
  public Collection<Resource> getAll() {
    return dao.getAll(Resource.class);
  }
}

在那之后,服务必须以某种方式注册。

谢谢!

1 个答案:

答案 0 :(得分:0)

解决方案简单如下:

@Path("/dynamic-classes")
public class DynamicRestResource {
    private static final Map<String, Class<?>> CLASS_NAME_MAP = Collections.unmodifiableMap(new HashMap<String, Class<?>>(){
        private static final long serialVersionUID = 1L;

    {
            put(MyClass1.class.getSimpleName().toLowerCase(), MyClass1.class);
            put(MyClass2.class.getSimpleName().toLowerCase(), MyClass2.class);
                        //... put here your other classes.
            }}
    );
  private Class<?> getMappedClass(String mappedPath) {
    return CLASS_NAME_MAP.get(mappedPath);
  }

  @GET
  @Path("/{className}")
  public Collection<?> getAll(@PathParam("className") String className) {
    //do some checks that there is such a path
    return dao.getAll(this.getMappedClass(className));
  }

  @DELETE
  @Path("/{className}/{entityId}")
  public Collection<?> deleteEntity(@PathParam("className") String className, @PathParam("entityId") Long entityId) {
    //do some checks that there is such a path
    return dao.delete(this.getMappedClass(className), entityId);
  }
}