Как установить корневой URL-адрес ViewBundle Dropwizard

Я много пробовал, но не смог найти, как выбрать корневой URL-адрес для всех ресурсов ViewBundle Dropwizard.

Мои конечные точки REST обслуживаются из , потому что я установил их с помощьюenvironment.jersey().setUrlPattern('/rest/*'...).

Мои статические ресурсы обслуживаются из , потому что я зарегистрировал , указав на него как на корень его URL-адресов:bootstrap.addBundle(new AssetsBundle("/" + resourceBasePath + "/public/", "/"));

Прямо сейчас, если я хочу получить представление, мне нужно добавить/restна его URL. Например, если я установлю@Path("/view/person/{id}"), он будет доступен только по адресу/rest/view/person/123.

Это не то, чего я хочу. Я хочу, чтобы он был доступен на/view/person/123.

Я предполагаю, что технически это должно быть возможно, посколькуAssetBundleпозволяет монтировать на/, должен быть способ смонтироватьViewBundleк/view.

Как мне это сделать?

2 ответа

Вы можете разделить ресурсы Jersey и ресурсы ViewBundle, используя два разных сервлета. Dropwizard позволяет настроить несколько сервлетов.

Вот пример кода, чтобы продемонстрировать это. В этом примере остальные API будут доступны из /api/ , а представления — из /.

      public class MyApp extends Application<MyConfiguration> {
    @Override
    public void run(MyConfiguration configuration, Environment environment) throws Exception {
        
        // Setting up REST APIs
        ServletRegistration.Dynamic jerseyServlet = environment.servlets().addServlet("jerseyServlet", ServletContainer.class);
        jerseyServlet.addMapping("/api/*");  // APIs will be accessible from /api/*
        jerseyServlet.setServlet(new ServletContainer(environment.jersey().getResourceConfig()));
        
        // Register resources to jersey environment
        environment.jersey().register(new MyResource());
        //... register other resources

        // Setting up views
        ServletRegistration.Dynamic viewServlet = environment.servlets().addServlet("viewServlet", ServletContainer.class);
        viewServlet.addMapping("/*");  // Views will be accessible from /*
        viewServlet.setServlet(new ServletContainer(new ResourceConfig().register(MyViewResource.class)));
        //... register other view resources
    }
}

В этом примереэто ресурс, обслуживающий REST API, и— это ресурс, обслуживающий представления.

Обратите внимание: порядок добавления этих сервлетов имеет значение. Сервлет с более общим шаблоном (в данном случае /*) следует добавлять последним.

Пожалуйста, измените это в соответствии с требованиями вашего приложения.

возможно, лучше настроить шаблон URL-адреса для пакета, поэтому сначала создайте собственный расширяющий класс, а затем переопределите метод и установите собственный шаблон URL-адреса для !

что-то вроде этого

      public class CustomViewBundle<T extends Configuration> extends ViewBundle<T> {

    @Override
    public void run(T configuration, Environment environment) {
        //set a custom URL pattern for the ViewBundle here!
        environment.jersey().setUrlPattern("/view/*");

        //to runnig the ViewBundle
        super.run(configuration, environment);
    }
}

сейчас в вашем приложенииrunметод, вы можете легко использовать пользовательскийViewBundleвместо стандартного, вот так:

      @Override
public void run(YourConfiguration configuration, Environment environment) {
    /* don't forget to replace YourConfiguration with 
       your configuration class name! */
    bootstrap.addBundle(new CustomViewBundle<>());
    // your code
}

ОК, как видите, теперь ваши представления будут доступны по таким URL-адресам, как/view/person/123вместо/rest/view/person/123и не забудьте обновить все@Pathаннотации в ваших классах ресурсов соответственно!

Другие вопросы по тегам