【问题标题】:Spring: can't access controller 404 not found errorSpring:无法访问控制器 404 not found 错误
【发布时间】:2020-08-26 18:23:41
【问题描述】:

我正在尝试访问 http://localhost:8088/test_war_exploded/home/hello,但收到 404 错误。我不知道为什么。

目录结构:

root
  src
    main
      java
         test
           config
              DbConfig.java
              MyAppInitializer.java
              WebConfig.java
          HomeController.java

WebConfig.java


@Configuration
@ComponentScan("test")
@EnableWebMvc
@EnableTransactionManagement
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableJpaRepositories(basePackages = "test",
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef = "transactionManager")
 public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureDefaultServletHandling(
                DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
    }

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();

        bean.setViewClass(JstlView.class);
        bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".html");


        return bean;
    }
}

MyAppInitializer.java

public class MyAppInitializer extends
                AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    public void onStartup(final ServletContext sc) throws ServletException {
        System.out.println("onStartup!");

        AnnotationConfigWebApplicationContext root =
                new AnnotationConfigWebApplicationContext();

        root.register(WebConfig.class);
        root.setServletContext(sc);

        root.scan("test");
        //sc.addListener(new ContextLoaderListener(root));

        ServletRegistration.Dynamic appServlet =
                sc.addServlet("dispatcher", new DispatcherServlet(new GenericWebApplicationContext()));
        appServlet.setLoadOnStartup(1);
        appServlet.addMapping("/");
    }

        @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SecurityConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

HomeController.java

@RestController
@RequestMapping("/home")
public class HomeController {

    @GetMapping(value = "/hello")
    public String hello() {
        return "Hello";
    }
}

应用程序已部署,服务器/IDE 日志中没有错误。在部署期间,onStartup 会打印在控制台中,这意味着 MyAppInitializer 中的代码会被执行。

【问题讨论】:

  • 你的 URL 中的“test_war_exploded”来自哪里?请改用localhost:8080/home/hello。如果可行,问题是您需要告诉它相对于 test_war_exploded 服务。
  • 不,它会自动打开那个 url - Idea Intellij,只是 localhost 没有部署!
  • ...您的评论毫无意义。您在哪里告诉 IntelliJ 使用“test_war_exploded”作为基本路径?由于您在共享的代码中没有指定它,那么除非您在其他地方告诉 IntelliJ(例如在运行配置中,您指定端口 8088 的同一位置),否则它只会在 localhost/ 而不是 localhost 提供它/test_war_exploded。
  • 我就像在这个视频中一样 - youtu.be/59D3DmAkxp0?t=38。最后,他访问了 /springblog 的 url,类似于我在 /test_war_exploded 访问它的方式。这不是问题
  • 尝试:用 Controller 替换 RestController 并在方法上添加 ResponseBody 注释。让我知道响应是什么

标签: java spring spring-boot spring-mvc


【解决方案1】:

HomeController 为 /home 提供映射。 要访问提到的端点,您可以将第一部分添加到 RequestMapping 注释中:@RequestMapping("test_war_exploded/home")

你尝试通过8088端口访问。默认端口是8080,如果没有在application.properties中设置,否则。

【讨论】:

    【解决方案2】:

    HomeController bean 未定义且未初始化。

    @Component
    @RestController
    @RequestMapping("/home")
    public class HomeController {
    
        @GetMapping(value = "/hello")
        public String hello() {
            return "Hello";
        }
    }
    

    【讨论】:

    • RestController 是 Component 的特殊形式。两个都加没感觉
    【解决方案3】:

    我想通了。问题是我没有初始化类。我添加了两个类:SecurityConfigSecurityWebApplicationInitializer

    SecurityConfig.java

    @Configuration
    @EnableGlobalMethodSecurity(prePostEnabled=true)
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter  {
        @Override
        protected void configure(HttpSecurity httpSecurity) throws Exception {
            httpSecurity.authorizeRequests().antMatchers("/").permitAll();
        }
    
        @Bean
        BCryptPasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }
    

    SecurityWebApplicationInitializer.java

    public class SecurityWebApplicationInitializer extends
                        AbstractSecurityWebApplicationInitializer {
        public SecurityWebApplicationInitializer() {
            super(SecurityConfig.class, WebConfig.class);
        }
    }
    

    这就是我的项目现在的样子:

    Main.java 只是用于maven-shade-plugin,没关系,它只包含空的main 方法:

    Main.java

    public class Main {
        public static void main(String[] args) {
    
        }
    }
    

    我的其他课程(更新)。为简单起见,我删除了数据库配置类。如果您不需要数据库,您可以从这个答案中复制粘贴类,它应该可以正常工作:

    MyAppInitializer.java

    public class MyAppInitializer extends
                    AbstractAnnotationConfigDispatcherServletInitializer {
        @Override
        public void onStartup(final ServletContext sc) throws ServletException {
            System.out.println("onStartup!");
    
            AnnotationConfigWebApplicationContext root =
                    new AnnotationConfigWebApplicationContext();
    
            root.register(WebConfig.class);
            root.setServletContext(sc);
    
            root.scan("test");
            //sc.addListener(new ContextLoaderListener(root));
    
            ServletRegistration.Dynamic appServlet =
                    sc.addServlet("dispatcher", new DispatcherServlet(new GenericWebApplicationContext()));
            appServlet.setLoadOnStartup(1);
            appServlet.addMapping("/");
        }
    
            @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[] {SecurityConfig.class};
        }
    
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }
    
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    }
    

    WebConfig.java

    @Configuration
    @ComponentScan("test")
    @EnableWebMvc
    @EnableTransactionManagement
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    @EnableJpaRepositories(basePackages = "test",
            entityManagerFactoryRef = "entityManagerFactory", transactionManagerRef = "transactionManager")
     public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**");
        }
    
    
        @Override
        public void configureDefaultServletHandling(
                    DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    }
    

    HomeController.java

    @RestController
    public class HomeController {
        @GetMapping("/")
        public String getHome()  {
            return "home";
        }
    }
    

    TestController.java

    @RestController
    public class TestController {
        @RequestMapping("/test")
        public String test()  {
            return "test";
        }
    }
    

    我从配置类中删除了视图解析器,因为我打算只使用休息控制器作为 API 提供者。感谢您参加我的 TED 演讲。

    PS 以下是pom.xml 的外观(这似乎很重要,因为使用不同的 poms,Intellij 不会自动生成战争爆炸的工件):

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>bigpuzzle</artifactId>
        <version>1.0-SNAPSHOT</version>
    
    
        <packaging>war</packaging>
    
        <pluginRepositories>
            <pluginRepository>
                <id>pcentral</id>
                <name>pcentral</name>
                <url>https://repo1.maven.org/maven2</url>
            </pluginRepository>
    
            <pluginRepository>
                <id>central</id>
                <name>Central Repository</name>
                <url>https://repo.maven.apache.org/maven2</url>
                <layout>default</layout>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    
        <repositories>
    
    
            <repository>
                <id>jcenter</id>
                <name>jcenter-bintray</name>
                <url>https://jcenter.bintray.com</url>
            </repository>
    
        </repositories>
    
    
        <dependencies>
            <!-- Jackson to convert Java object to Json -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.4</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.9.4</version>
            </dependency>
    
    
    
    
            <dependency>
                <groupId>net.sourceforge</groupId>
                <artifactId>jwbf</artifactId>
                <version>3.1.1</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.6</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core</artifactId>
                <version>5.3.1.RELEASE</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>5.2.5.RELEASE</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.2.5.RELEASE</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-core</artifactId>
                <version>5.3.1.RELEASE</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-config</artifactId>
                <version>5.3.1.RELEASE</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-web</artifactId>
                <version>5.3.1.RELEASE</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-jpa</artifactId>
                <version>2.2.6.RELEASE</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>5.2.5.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf</artifactId>
                <version>3.0.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.thymeleaf</groupId>
                <artifactId>thymeleaf-spring4</artifactId>
                <version>3.0.7.RELEASE</version>
            </dependency>
    
    
            <dependency>
                <groupId>org.apache.opennlp</groupId>
                <artifactId>opennlp-tools</artifactId>
                <version>1.9.1</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/net.dv8tion/JDA -->
            <dependency>
                <groupId>net.dv8tion</groupId>
                <artifactId>JDA</artifactId>
                <version>4.0.0_46</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.4.4.Final</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>1.4.197</version>
                <scope>test</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
                <version>5.2.5.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>9.4-1203-jdbc4</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.security.oauth/spring-security-oauth2 -->
            <dependency>
                <groupId>org.springframework.security.oauth</groupId>
                <artifactId>spring-security-oauth2</artifactId>
                <version>2.4.1.RELEASE</version>
            </dependency>
    
            <!--is needed for jwt-->
            <!-- https://mvnrepository.com/artifact/javax.xml/jaxb-api -->
            <dependency>
                <groupId>javax.xml</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.1</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl -->
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-impl</artifactId>
                <version>3.0.0-M4</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core -->
            <dependency>
                <groupId>com.sun.xml.bind</groupId>
                <artifactId>jaxb-core</artifactId>
                <version>3.0.0-M4</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-jwt -->
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-jwt</artifactId>
                <version>1.1.0.RELEASE</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>0.9.1</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/com.jakewharton.fliptables/fliptables -->
            <dependency>
                <groupId>com.jakewharton.fliptables</groupId>
                <artifactId>fliptables</artifactId>
                <version>1.0.2</version>
            </dependency>
    
    
    
    
            <dependency>
                <groupId>com.squareup.okhttp3</groupId>
                <artifactId>okhttp</artifactId>
                <version>3.4.2</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.json/json -->
            <dependency>
                <groupId>org.json</groupId>
                <artifactId>json</artifactId>
                <version>20190722</version>
            </dependency>
    
    
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
    
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.8</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.14</version>
            </dependency>
    
    
            <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>2.3.1</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <finalName>bigpuzzle</finalName>
    
    
            <plugins>
    
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>3.0.0</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <shadedArtifactAttached>true</shadedArtifactAttached>
    
                                <transformers>
                                    <transformer
                                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>bigpuzzle.Main</mainClass>
                                        <manifestEntries>
                                            <Main-Class>bigpuzzle.Main</Main-Class>
                                        </manifestEntries>
                                    </transformer>
                                </transformers>
    
    
                                <filters>
                                    <filter>
                                        <artifact>*:*</artifact>
                                        <excludes>
                                            <exclude>META-INF/*.SF</exclude>
                                            <exclude>META-INF/*.DSA</exclude>
                                            <exclude>META-INF/*.RSA</exclude>
                                        </excludes>
                                    </filter>
                                </filters>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.3</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals><goal>copy</goal></goals>
                            <configuration>
    
                                <artifactItems>
    
                                    <artifactItem>
                                        <groupId>com.github.jsimone</groupId>
                                        <artifactId>webapp-runner</artifactId>
                                        <version>8.0.30.2</version>
                                        <destFileName>webapp-runner.jar</destFileName>
                                    </artifactItem>
    
                                </artifactItems>
    
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    
    
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.2.2</version>
    
                </plugin>
    
            </plugins>
        </build>
    
    </project>
    

    配置 Tomcat Local 后,您可以更改此 pom.xml。

    如果您还需要数据库支持,请将此文件添加到配置包中:

    package bigpuzzle.config;
    
    import org.hibernate.SessionFactory;
    import org.hibernate.jpa.HibernatePersistenceProvider;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.transaction.PlatformTransactionManager;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.util.Properties;
    
    
    @Configuration
     @EnableTransactionManagement
    @EnableJpaRepositories(basePackages = "bigpuzzle", entityManagerFactoryRef = "entityManagerFactory")
     public class DbConfig {
        @Primary
        @Bean(name = "entityManagerFactory")
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
            entityManagerFactoryBean.setDataSource(getDatasource());
            entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
    
            entityManagerFactoryBean.setJpaProperties(getHibernateProperties());
    
            entityManagerFactoryBean.setPackagesToScan("bigpuzzle");
    
            return entityManagerFactoryBean;
        }
    
    
        @Bean
        public DataSource getDatasource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("org.postgresql.Driver");
            dataSource.setUrl("jdbc:postgresql://127.0.0.1:5432/bigpuzzle");
            dataSource.setUsername("postgres");
            dataSource.setPassword("123456");
            return dataSource;
        }
    
        @Primary
        @Bean
        public SessionFactory getSessionFactory() throws IOException {
            LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
            sessionFactoryBean.setPackagesToScan("bigpuzzle");
            //getHibernateProperties method is a private method
    
            sessionFactoryBean.setHibernateProperties(getHibernateProperties());
            sessionFactoryBean.setDataSource(getDatasource());
            sessionFactoryBean.afterPropertiesSet();
    
            return sessionFactoryBean.getObject();
        }
    
        @Bean(name = "transactionManager")
         public PlatformTransactionManager transactionManager() throws IOException {
            /*HibernateTransactionManager transactionManager = new HibernateTransactionManager();
            transactionManager.setSessionFactory(getSessionFactory());*/
    
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
            return transactionManager;
        }
    
    
        @Bean
        private static Properties getHibernateProperties() {
            Properties hibernateProperties = new Properties();  //PostgreSQLDialect
            //hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
            hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
            hibernateProperties.put("hibernate.connection.driver_class", "org.postgresql.Driver");
            hibernateProperties.put("hibernate.show_sql", true);
            hibernateProperties.put("hibernate.allow_update_outside_transaction",  false);
        //    hibernateProperties.put("spring.jpa.hibernate.ddl-auto", "create");
    
            hibernateProperties.put( "hibernate.hbm2ddl.auto", "create-drop");  //create-drop or update
             /*hibernateProperties.setProperty(
                    "hibernate.dialect", "org.hibernate.dialect.H2Dialect");
    */
            System.out.println();
    
            hibernateProperties.put("spring.jpa.properties.hibernate.show_sql", "false");
            hibernateProperties.put("spring.jpa.properties.hibernate.use_sql_comments", "true");
            hibernateProperties.put("spring.jpa.properties.hibernate.format_sql", "true");
            hibernateProperties.put("spring.jpa.properties.hibernate.type", "trace");
            hibernateProperties.put("spring.jpa.show-sql", "true");
            hibernateProperties.put("logging.level.org.hibernate", "TRACE");
    
    
            // other properties
            return hibernateProperties;
        }
    }
    

    PS 如果您也使用 Idea Intellij,请关注this video 将应用程序部署到 Tomcat 上。

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      相关资源
      最近更新 更多