SpringBoot中的RequestMapping方法未被调用

3

我正在学习Spring Boot,使用了Spring Java Persistence API(JPA)和Apache Derby作为数据库。我遇到了将URL映射到方法上的问题。

我有一些话题:

@Entity
public class Topic {

@Id
private String id;
private String name;
private String description;

public Topic() {

}

public Topic(String id, String name, String description) {
    this.id = id;
    this.name = name;
    this.description = description;
} ... getters & setters...

我有一个主题控制器。它工作得很好:

@RestController
    public class TopicController {

@Autowired
private TopicService topicServ;

@RequestMapping("/topics")
public List<Topic> getAllTopics() {
    return topicServ.getAllTopics();
} 
@RequestMapping("/topics/{topicId}")
public Topic getTopic(@PathVariable String topicId) {
    return topicServ.getTopic(topicId);
}... more methods (they work fine)

每个主题都有相应的课程:

@Entity
public class Course {

private String id;
private String name;
private String description;
@ManyToOne
private Topic topic;

public Course() {

}

public Course(String id, String name, String description, String topicId) {
    this.id = id;
    this.name = name;
    this.description = description;
    this.setTopic(new Topic(topicId, "CourseConstructorNAME", "CourseConstructorDESCRIPTION"));
} ... getters & setters ...

我有一个课程控制器(courses controller),我正在查找问题:

@RestController
public class CourseController {

@Autowired
private CourseService courseServ;

@GetMapping(value = "/topics/{topicId}/courses")
public List<Course> getAllCourses(@PathVariable("topicId") String topicId){
    System.out.println("Hi"); *<-- does not print anything*
    return courseServ.getAllCourses(topicId);
}

问题在于,向http://localhost:8080/topics/java/courses发送GET请求会返回404错误信息:
{
"timestamp": "2018-11-26T19:30:08.871+0000",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/topics/java/courses"
}

我期望能够获得与URL中的主题ID对应的课程列表。由于主题控制器运行良好且几乎相同,因此失败让我感到困惑。
因为我放在上面的sysout没有打印任何内容,所以我一定做了些非常愚蠢的事情;但是为了以防万一,这是courseServ的代码:
@Service
public class CourseService {

@Autowired
private CourseRepository courseRepo;

public List<Course> getAllCourses(String topicId){
    System.out.println("Calling get all courses from course service");
    List<Course> theList = new ArrayList<Course>();
    courseRepo.findByTopic_Id(topicId).forEach(theList::add);

    System.out.println(theList.toString());

    return theList; 
}

这里是课程存储库:

public interface CourseRepository extends CrudRepository<Course, String> {

    public List<Course> findByTopic_Id(String topicId);
}

这里是Spring框架的控制台日志:

2018-11-26 13:29:25.142  INFO 16252 --- [           main] P.ProjectNameWithJpaApplication          : Starting ProjectNameWithJpaApplication on JulioPHX with PID 16252 (C:\SpringToolSuite\workspace\ProjectNameWithJPA\target\classes started by JulioPHX in C:\SpringToolSuite\workspace\ProjectNameWithJPA)
2018-11-26 13:29:25.148  INFO 16252 --- [           main] P.ProjectNameWithJpaApplication          : No active profile set, falling back to default profiles: default
2018-11-26 13:29:27.107  INFO 16252 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2018-11-26 13:29:27.238  INFO 16252 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 116ms. Found 1 repository interfaces.
2018-11-26 13:29:28.254  INFO 16252 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$c18d73e6] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-11-26 13:29:29.466  INFO 16252 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2018-11-26 13:29:29.501  INFO 16252 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2018-11-26 13:29:29.502  INFO 16252 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/9.0.12
2018-11-26 13:29:29.525  INFO 16252 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jre1.8.0_191\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_191/bin/server;C:/Program Files/Java/jre1.8.0_191/bin;C:/Program Files/Java/jre1.8.0_191/lib/amd64;C:\Scripts\;C:\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Python37\;C:\Python37\Scripts;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\iCLS\;C:\Program Files\Intel\Intel(R) Management Engine Components\iCLS\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Git\cmd;C:\Program Files\RedHat\java-1.8.0-openjdk-1.8.0.161-1\bin;C:\WINDOWS\System32\OpenSSH\;C:\MinGW\bin;C:\Program Files\MicrosoftVSCode\bin;C:\cygwin64\bin;C:\Program Files\apache-maven-3.5.4\bin;C:\Users\JulioPHX\AppData\Local\Microsoft\WindowsApps;;C:\Users\JulioPHX\Microsoft VS Code\bin;C:\SpringToolSuite\sts-bundle\sts-3.9.6.RELEASE;;.]
2018-11-26 13:29:29.773  INFO 16252 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2018-11-26 13:29:29.774  INFO 16252 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 4461 ms
2018-11-26 13:29:29.852  INFO 16252 --- [           main] o.s.b.w.servlet.ServletRegistrationBean  : Servlet dispatcherServlet mapped to [/]
2018-11-26 13:29:29.861  INFO 16252 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2018-11-26 13:29:29.862  INFO 16252 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2018-11-26 13:29:29.862  INFO 16252 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'formContentFilter' to: [/*]
2018-11-26 13:29:29.862  INFO 16252 --- [           main] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2018-11-26 13:29:30.698  INFO 16252 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2018-11-26 13:29:30.703  WARN 16252 --- [           main] com.zaxxer.hikari.util.DriverDataSource  : Registered driver with driverClassName=org.apache.derby.jdbc.EmbeddedDriver was not found, trying direct instantiation.
2018-11-26 13:29:31.587  INFO 16252 --- [           main] com.zaxxer.hikari.pool.PoolBase          : HikariPool-1 - Driver does not support get/set network timeout for connections. (Feature not implemented: No details.)
2018-11-26 13:29:31.596  INFO 16252 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2018-11-26 13:29:31.764  INFO 16252 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2018-11-26 13:29:31.925  INFO 16252 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.7.Final}
2018-11-26 13:29:31.929  INFO 16252 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2018-11-26 13:29:32.247  INFO 16252 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
2018-11-26 13:29:32.586  INFO 16252 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.DerbyTenSevenDialect
2018-11-26 13:29:34.603  WARN 16252 --- [           main] o.h.t.s.i.ExceptionHandlerLoggedImpl     : GenerationTarget encountered exception accepting command : Error executing DDL "drop table topic" via JDBC Statement

org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "drop table topic" via JDBC Statement

Caused by: java.sql.SQLSyntaxErrorException: Schema 'SA' does not exist

Caused by: org.apache.derby.iapi.error.StandardException: Schema 'SA' does not exist

2018-11-26 13:29:34.718  INFO 16252 --- [           main] o.h.t.schema.internal.SchemaCreatorImpl  : HHH000476: Executing import script 'org.hibernate.tool.schema.internal.exec.ScriptSourceInputNonExistentImpl@74b00247'
2018-11-26 13:29:34.725  INFO 16252 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2018-11-26 13:29:36.108  INFO 16252 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2018-11-26 13:29:36.251  WARN 16252 --- [           main] aWebConfiguration$JpaWebMvcConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2018-11-26 13:29:36.757  INFO 16252 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2018-11-26 13:29:36.763  INFO 16252 --- [           main] P.ProjectNameWithJpaApplication          : Started ProjectNameWithJpaApplication in 12.543 seconds (JVM running for 13.617)
2018-11-26 13:29:42.083  INFO 16252 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2018-11-26 13:29:42.084  INFO 16252 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2018-11-26 13:29:42.100  INFO 16252 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 16 ms
2018-11-26 13:29:42.298  INFO 16252 --- [nio-8080-exec-1] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory

还有pom.xml文件:

<?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>PackageNameWithJPA</groupId>
<artifactId>ProjectNameWithJPA</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>ProjectNameWithJPA</name>
<description>Demo project for Spring Boot</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.0.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

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

    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>


</project>

项目结构:

enter image description here

感谢您提前的任何帮助。


1
尝试将您的包重命名为小写字母。https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html另外,发布您的Project.....Application.class。 - cvdr
1
你是如何配置你的上下文环境的? - Jason
1
你似乎在主题和课程中有不同的根包名称:PackageNameWithJPA.topic 和 ProjectNameWithJPA.course。这是有意为之吗?如果你从 PackageNameWithJPA 扫描,那么你的课程控制器将不会被包含进去。 - Jason
@Jason 是的,这是有意为之的,但我刚开始学习这个框架,如果这不是正确的做法,我会改变它。然后我将在同一个包_PackageNameWithJPA_中包括主题和课程控制器...谢谢。 - Julio
4个回答

11

我有同样的问题,这是因为您的属性默认设置为:“spring.jpa.hibernate.ddl-auto=create-drop”

在application.properties文件中更改它。如果没有,请添加以下行:

"spring.jpa.hibernate.ddl-auto=update"

在您的application.properties文件中。它会正常工作。


5

即使我使用Apache Derby时也遇到了相同的错误。这是由于Spring的默认属性 -spring.jpa.hibernate.ddl-auto=create-drop引起的。

解决方法:src/main/resources文件夹中创建一个application.properties文件,将属性更改为spring.jpa.hibernate.ddl-auto=update,然后再次运行应用程序,它应该可以正常工作。


0

在Spring Boot项目中,您始终可以定义自定义组件扫描。默认情况下,@SpringBootApplication注释处理应用程序的组件扫描。但是,假设其中一个组件在另一个包中定义,则可以在配置类中定义,例如:

@ComponentScan({"com.springboot.basics.springbootPA1","com.springboot.springbootPA2"}) @SpringBootApplication public class testApplication{


0

谢谢你的帮助,我会阅读那篇文章并相应地更新项目结构。 - Julio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接