我正在尝试使用注释而不是部署描述符在Java中编写示例REST服务。
@ApplicationPath("/services")
public class RestApp extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<>();
classes.add(Request.class);
return classes;
}
}
样本请求类
@Path("sequence-numbers")
public class Request {
@POST
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@Consumes(MediaType.APPLICATION_JSON)
public Response createInstance(SnsConfig snsConfig, @Context final HttpServletResponse servletResponse,
@Context final HttpServletRequest servletRequest) {
}
}
如果从代码中删除了classes.add(Request.class),则不应公开@Path(“ sequence-numbers”)。但是,即使我注释掉classes.add语句,在发送请求时也会调用post方法。我对注释的使用是否错误,或者是否有其他原因可能导致这种情况?
编辑:我试图注释掉整个getClasses方法,但仍然有效。我想如果@ApplicationPath下没有指定任何类,那么将扫描所有文件以查找@Path的存在。我想要使用getClasses的原因是检查一些特定于应用程序的条件,并决定添加还是不添加类/ @ Path。有没有一种方法可以根据条件公开REST资源?
最佳答案
是的,这是可能的。如果在getClasses()
方法中返回空Set,或者没有从getClasses()
覆盖getSingletons()
(或javax.ws.rs.core.Application
),则将扫描所有路径。如果返回非空集,则仅会发布指定的类。