Как установить корневой 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
}
}
В этом примере
Обратите внимание: порядок добавления этих сервлетов имеет значение. Сервлет с более общим шаблоном (в данном случае /*) следует добавлять последним.
Пожалуйста, измените это в соответствии с требованиями вашего приложения.
возможно, лучше настроить шаблон 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
аннотации в ваших классах ресурсов соответственно!