Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Dropwizard服务多个静态资产_Java_Reactjs_Dropwizard - Fatal编程技术网

Java 使用Dropwizard服务多个静态资产

Java 使用Dropwizard服务多个静态资产,java,reactjs,dropwizard,Java,Reactjs,Dropwizard,我正在构建一个react应用程序,并尝试使用AssetBundle提供服务,例如: @Override public void initialize(final Bootstrap<PersonalWebsiteConfiguration> bootstrap) { bootstrap.addBundle(new SwaggerBundle<PersonalWebsiteConfiguration>() { prot

我正在构建一个react应用程序,并尝试使用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"));
    }

这样就不会与我的API发生冲突

这对我的React应用程序的登录页非常有用。每当我尝试路由/登录/仪表板时,都找不到来自UI的此页面。因此,我尝试添加更多捆绑包来解决路由问题:

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

现在,只有仪表板在工作。是否有人知道如何为具有多个路由/页面的React构建提供服务。

对于单页应用程序,您需要每个客户端路由返回index.html(以支持浏览器重新加载或在/以外的路径上登录) 据我所知,Dropwizard AssetBundle无法做到这一点,即使用index.html为所有路由提供服务。 参见类似的(旧)

您可以自己实现一个servlet过滤器,或者使用一些社区插件,比如

我必须说,另一种方法更适合我,根本不使用dropwizard为静态资产提供服务,只将其用作后端API。
为API和静态资产使用CDN路由或不同的子域。这样,您可以在www.mydomain.com上拥有静态资产,在API.mydomain.com上拥有API(或者使用相同的域并基于路径前缀,例如/API路由到后端或静态资源)

您可以添加一个过滤器来实现该功能。 有关实现这种过滤器的dropwizard插件,请参阅。 以下独立示例代码位于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, "/*")
    }

}
class SinglePageAppFilter:过滤器{
覆盖过滤器(servletRequest:servletRequest,
servletResponse:servletResponse,
链:过滤器链){
val request=servletRequest作为HttpServletRequest
val response=servletResponse作为HttpServletResponse
if(request.requestURI==“/”| | request.requestURI.startsWith(“/api”)){
doFilter(servletRequest,servletResponse)
}否则{
val wrapper=ResponseWrapper(响应)
doFilter(servletRequest,包装器)
val sc=wrapper.sc
if(sc==HttpServletResponse.sc\u未找到){
request.getRequestDispatcher(“/”).forward(请求、响应)
}否则如果(sc!=null){
响应。发送错误(sc)
}
}
}
重写fun init(filterConfig:filterConfig){}
重写函数(){}
}
类ResponseWrapper(响应:HttpServletResponse):HttpServletResponseWrapper(响应){
变量sc:Int?=null
覆盖错误(sc:Int){
this.sc=sc
}
}
类MyApplication:Application(){
覆盖乐趣初始化(引导:引导){
addBundle(AssetsBundle(“/assets”、“/”、“index.html”))
}
覆盖有趣的运行(配置:MyConfiguration,环境:environment){
environment.servlets().addFilter(“SinglePageAppFilter”,SinglePageAppFilter())
.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,“/*”)
}
}

请仔细阅读手册中的内容:同时仔细查看提供的样本。
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, "/*")
    }

}