Обслуживание нескольких активов c с помощью Dropwizard - PullRequest
2 голосов
/ 06 марта 2020

У меня есть приложение реагирования, которое я создаю и пытаюсь обслуживать с помощью AssetBundle, например:

    @Override
    public void initialize(final Bootstrap<PersonalWebsiteConfiguration> bootstrap) {
        bootstrap.addBundle(new SwaggerBundle<PersonalWebsiteConfiguration>() {
            protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(final PersonalWebsiteConfiguration configuration) {
                return configuration.swaggerBundleConfiguration;
            }
        });
        bootstrap.addBundle(new AssetsBundle("/build", "/", "index.html"));
    }

Я также добавил конфигурацию

server:
  rootPath: /api

, чтобы не было Это не конфликтует с моим API.

Это прекрасно работает только для целевой страницы моего приложения React. Всякий раз, когда я пробую маршрут / логин / панель инструментов, эта страница из пользовательского интерфейса не найдена. Поэтому я попытался добавить больше пакетов, чтобы решить эту проблему с маршрутизацией:

        bootstrap.addBundle(new AssetsBundle("/build", "/", "index.html"));
        bootstrap.addBundle(new AssetsBundle("/build", "/login", "index.html"));
        bootstrap.addBundle(new AssetsBundle("/build", "/dashboard", "index.html"));

Теперь работает только панель инструментов. Кто-нибудь знает, как обслуживать сборку React с несколькими маршрутизацией / страницами.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Вы можете добавить фильтр для реализации функциональности. Плагин dropwizard, реализующий этот тип фильтра, см. https://github.com/xvik/dropwizard-guicey-ext/tree/master/guicey-spa. Следующий автономный пример кода находится в Kotlin.

class SinglePageAppFilter : Filter {

    override fun doFilter(servletRequest: ServletRequest,
                          servletResponse: ServletResponse,
                          chain: FilterChain) {
        val request = servletRequest as HttpServletRequest
        val response = servletResponse as HttpServletResponse
        if (request.requestURI == "/" || request.requestURI.startsWith("/api")) {
            chain.doFilter(servletRequest, servletResponse)
        } else {
            val wrapper = ResponseWrapper(response)
            chain.doFilter(servletRequest, wrapper)
            val sc = wrapper.sc
            if (sc == HttpServletResponse.SC_NOT_FOUND) {
                request.getRequestDispatcher("/").forward(request, response)
            } else if (sc != null) {
                response.sendError(sc)
            }
        }
    }

    override fun init(filterConfig: FilterConfig) {}

    override fun destroy() {}

}

class ResponseWrapper(response: HttpServletResponse) : HttpServletResponseWrapper(response) {

    var sc: Int? = null

    override fun sendError(sc: Int) {
        this.sc = sc
    }

}

class MyApplication : Application<MyConfiguration>() {

    override fun initialize(bootstrap: Bootstrap<MyConfiguration>) {
        bootstrap.addBundle(AssetsBundle("/assets", "/", "index.html"))
    }

    override fun run(configuration: MyConfiguration, environment: Environment) {
        environment.servlets().addFilter("SinglePageAppFilter", SinglePageAppFilter())
            .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*")
    }

}
0 голосов
/ 09 марта 2020

Для одностраничного приложения вам потребуется каждый клиентский маршрут для возврата индекса. html (для поддержки перезагрузки браузера или приземления на пути, отличные от /) Насколько мне известно, Dropwizard AssetBundle не может этого сделать, т.е. обслуживать все маршруты с индексом. html. См. Аналогичный (старый) вопрос .

Вы можете реализовать фильтр сервлетов самостоятельно или использовать какой-нибудь плагин сообщества, например этот .

Я должен сказать, что другой подход работал лучше для меня, не используйте dropwizard для обслуживания ресурсов stati c, используйте его только как бэкэнд-API. Используйте маршрутизацию CDN или другие субдомены для API и ресурсов stati c. Таким образом, вы можете иметь свои ресурсы c на www.mydomain.com и свой API на api.mydomain.com (или использовать тот же домен и на основе префикса пути, например, / api route to backend или stati c resources)

...