Hacker News new | ask | show | jobs
by logn 4412 days ago
For static resources you can load them like this:

    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();
      }
1 comments

Thanks, but I was referring to say a dynamic database-backed resource.

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.