public class WebAppConfig extends ResourceConfig { private final String[] mimeTypes; public WebAppConfig() throws IOException { //load static resource from htdocs dir Collection<File> files = FileUtils.listFiles(new File("./htdocs"), null, true); ArrayList<String> mimeTypeList = new ArrayList<String>(); for (File file : files) { final byte[] contents = FileUtils.readFileToByteArray(file); Resource.Builder resourceBuilder = Resource.builder(); resourceBuilder.path(file.getAbsolutePath().split("/htdocs/")[1]); final ResourceMethod.Builder methodBuilder = resourceBuilder.addMethod("GET"); String mimeType = Files.probeContentType(Paths.get(file.toURI())); if (!mimeTypeList.contains(mimeType)) { mimeTypeList.add(mimeType); } methodBuilder.produces(mimeType) .handledBy(new Inflector<ContainerRequestContext, byte[]>() { @Override public byte[] apply(ContainerRequestContext req) { return contents; } }); registerResources(resourceBuilder.build()); } //load dynamic resources implementing interface Webpage register(MultiPartFeature.class); Reflections reflections = new Reflections(new ConfigurationBuilder() .setUrls(ClasspathHelper.forJavaClassPath()) .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("com.example.mycompany")))); Set<Class<? extends Webpage>> webpageClasses = reflections.getSubTypesOf(Webpage.class); for (Class<? extends Webpage> webpageClass : webpageClasses) { registerResources(Resource.builder(webpageClass).build()); } mimeTypes = mimeTypeList.toArray(new String[0]); } public String[] mimeTypes() { return mimeTypes; } } ... public synchronized void start() throws Exception { WebAppConfig config = new WebAppConfig(); HttpServer httpServer = GrizzlyHttpServerFactory.createHttpServer(URL, config, false); CompressionConfig compressionConfig = httpServer.getListener("grizzly").getCompressionConfig(); compressionConfig.setCompressionMode(CompressionConfig.CompressionMode.ON); compressionConfig.setCompressionMinSize(1); compressionConfig.setCompressableMimeTypes(config.mimeTypes()); httpServer.start(); wait(); }
With SDR, you have an @Entity, and a @Repository for that entity, and SDR handles the whole HTTP part, i.e. you don't need to write a @Controller to expose the repository.
Just wondering if Jersey has anything similar.