当前位置: 首页 > 知识库问答 >
问题:

Spring Boot和Jersey 2无法提供静态内容

谭裕
2023-03-14

有没有任何方法使Spring靴与泽西服务静态内容?我已经学习了一系列关于将Swagger集成到Spring Boot应用程序中的教程和代码示例。我可以让它交付基本的Swagger.json,但我不能让Swagger UI工作。

<!--Spring Boot-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- Jersey -->
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-spring3</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-bean-validation</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>${jersey.version}</version>
</dependency>

<!-- Swagger -->
<dependency>
    <groupId>io.swagger</groupId>
    <artifactId>swagger-jersey2-jaxrs</artifactId>
    <version>1.5.7</version>
</dependency>
@Configuration
@EnableAutoConfiguration
@ComponentScan({"com.xxxx"})
public class AdminApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(AdminApplication.class)
                .run(args);
    }

    @Bean
    public ServletRegistrationBean jerseyServlet() {
        ServletRegistrationBean registration = new ServletRegistrationBean(new ServletContainer(), "/*");
        registration.addInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, JerseyConfig.class.getName());
        return registration;
    }
}




package com.xxxxxx.admin.config;
import com.xxxxxx.admin.resource.Status;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;
import org.glassfish.jersey.server.spring.scope.RequestContextFilter;    
import io.swagger.jaxrs.config.BeanConfig;

public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(RequestContextFilter.class);
        packages("com"); // TODO needs more detailed level
        register(LoggingFilter.class);
        // Validation
        this.property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
        this.property(ServerProperties.RESPONSE_SET_STATUS_OVER_SEND_ERROR, true);
        configureSwagger();
    }

    private void configureSwagger() {
        register(io.swagger.jaxrs.listing.ApiListingResource.class);
        register(io.swagger.jaxrs.listing.SwaggerSerializers.class);
        BeanConfig beanConfig = new BeanConfig();
        beanConfig.setVersion("1.0.0");
        beanConfig.setSchemes(new String[]{"http"});
        beanConfig.setHost("localhost:8080");
        beanConfig.setBasePath("/"); // tried other things like "/api", but doesn't change anything
        beanConfig.setResourcePackage("com.xxxxxx.admin");
        beanConfig.setPrettyPrint(true);
        beanConfig.setScan(true);
    }

}



//other imports
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Service
@Path("/status")
@Api(value = "status", description = "Check status")
public class Status {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @ApiOperation("Return status")
    public Response status() {
        return Response.ok("Up").build();
    }
}
@ApplicationPath("/rootPath")
public class JerseyConfig extends ResourceConfig {

正如我所说的,我的应用程序运行良好,http://localhost:8080/swagger.json向我显示了普通的json文档,但http://localhost:8080/hello.txt和http://localhost:8080/swagger/index.html都返回404。

我用的是Jersey 2.8和Spring Boot 1.3.0

共有1个答案

元玮
2023-03-14

我还尝试更改了Jersey的servlet模式

@ApplicationPath("/rootPath")
public class JerseyConfig extends ResourceConfig {

您配置应用程序的方式,@applicationpath并不重要。它对您链接到的答案起作用的原因是Spring Boot自动配置在从资源配置中提取@applicationpath值时设置servlet映射。

您当前没有使用Spring Boot提供的ServletRegistrationBean来实现这一点。如果您的目标是通过使用自己的ServletRegistrationBean,以便可以注册ResourceConfig,那么您可以通过以下两种方法来完成同样的操作:

@Bean
public ResourceConfig config() {
    return new JerseyConfig();
}

当您让Spring Boot处理配置时,您可以看到JerseyAutoConfiguration来了解免费获得的所有内容。

如果希望保留当前的springregistrationbean,只需更改正在使用的路径。您正在使用/*,链接的答案中提到了这是问题所在。因此,只要更改为/roopath/*(如果需要的话)。

 类似资料:
  • 我无法访问静态内容(angular app),甚至无法访问简单的索引。来自spring boot的html文件。我一直收到404错误。Spring没有为我提供这些静态文件。自从升级到Spring Boot 2.2.4后,我就遇到了这个问题。我必须升级以应对Zip64问题。 我的application.properties里有这样一句话: 我也有自己的staticResourceConfigurat

  • 问题内容: 我无法让Spring-boot项目提供静态内容。 我已经放在一个命名的文件夹下。在其中,我有一个名为的文件夹。当我打包应用程序并运行它时,它找不到我放在该文件夹中的图像。 我试图把静态文件中,并但没有任何工程。 如果我我可以看到文件在正确文件夹的jar中:例如,但是调用:http://localhost:8080/images/head.png,我得到的只是一个404 有什么想法为什么

  • 问题内容: 这是我的项目文件夹 这是我index.js中的静态文件配置 这是我的index.html 这是我的nginx配置 但是我在所有脚本上都得到404。另一个奇怪的是,这些文件上的mime-type设置为 我在这里做错了什么? 我有一个项目,该项目具有相同的项目结构,并且具有相同的配置,但它适用于此项目,在这种情况下不起作用。 问题答案: 您无需配置Nginx 和 Express即可提供静态

  • 我试图提供一个静态资源(css文件)。 我已经注册了位置和处理程序 所以Tomcat的记录器显示到资源的正确映射 将URL路径[/resources/**]映射到类型为[类org.springframework.web.servlet.resource.ResourceHttpRequestHandler]的处理程序上 当浏览器呈现视图时,检查器显示404错误,试图获取静态资源。 应用初始化器。J

  • 问题内容: 我在两个不同的容器(Tomcat和Jetty)上部署了一个webapp,但是它们用于提供静态内容的默认servlet具有处理我要使用的URL结构的不同方式(详细信息)。 因此,我希望在web应用程序中包含一个小型servlet,以提供其自己的静态内容(图像,CSS等)。Servlet应该具有以下属性: No external dependencies Simple and reliab

  • 谷歌云文档对该应用的可用语法不是很精确。用于我的节点的yaml文件。js应用程序。 我使用了GAE的Python留档中描述的语法,从中我发现了处理程序mecism: 我避免使用expressjs规则来服务/public/index。html内容,最后我得到了一个404错误,这意味着GAE不是作为静态内容提供我的页面: 你有什么线索吗?节点。js与制作API、生成动态内容相关。。。但我更喜欢使用谷歌