REST API 查询 return 404?

REST API queries return a 404?

我使用 REST API 创建了一个简单的 Spring 引导应用程序。我正在使用以下控制器:

package me.hiboy.SpringBootRESTAPI;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class BlogController {
    @Autowired
    BlogRepository blogRepository;

    @GetMapping("/blog")
    public List<Blog> index() {
        return blogRepository.findAll();
    }

    @GetMapping("/blog/{id}")
    public Blog show(@PathVariable String id) {
        int blogId=Integer.parseInt(id);
        return blogRepository.findOne(blogId);
    }

    @PostMapping("/blog/search")
    public List<Blog> search(@RequestBody Map<String, String> body) {
        String searchTerm=body.get("text");
        return blogRepository.findByTitleContainingOrContentContaining(searchTerm, searchTerm);
    }

    @PostMapping("/blog")
    public Blog create(@RequestBody Map<String, String> body) {
        String title=body.get("title");
        String content=body.get("content");

        return blogRepository.save(new Blog(title, content));
    }

    @PutMapping("/blog/{id}")
    public Blog update(@PathVariable String id, @RequestBody Map<String, String> body) {
        int blogId=Integer.parseInt(id);
        Blog blog=blogRepository.findOne(blogId);
        blog.setTitle(body.get("title"));
        blog.setContent(body.get("content"));

        return blogRepository.save(blog);
    }

    @DeleteMapping("/blog/{id}")
    public boolean delete(@PathVariable String id) {
        int blogId=Integer.parseInt(id);
        blogRepository.delete(blogId);
        return true;
    }
}

以及以下实体:

package me.hiboy.SpringBootRESTAPI;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Blog {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;

    private String title;
    private String content;

    public Blog() {}

    public Blog(String title, String content) {
        this.setTitle(title);
        this.setContent(content);
    }

    public Blog(int id, String title, String content) {
        this.setId(id);
        this.setTitle(title);
        this.setContent(content);
    }

    public int getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public String getContent() {
        return content;
    }

    public void setId(int id) {
        this.id=id;
    }

    public void setTitle(String title) {
        this.title=title;
    }

    public void setContent(String content) {
        this.content=content;
    }

    @Override
    public String toString() {
        return "Blog{" + 
                "id=" + id +  
                ", title='" + title + '\'' +
                ", content='" + content + '\'' + 
                '}';
    }
}

但是,由于某些原因,当我访问 localhost 时无法得到任何响应(我得到 404 响应)。有人可以指出我必须缺少的东西吗?这是一个简单的教程,我遵循 this tutorial 和我构建的其他文件包括:pom.xmlapplication.propertiesdatabase.sqlApp.java(其中有我的 main() 函数和 BlogRepository.java.

谢谢!

编辑:

App.java如下:

package me.hiboy.SpringBootRESTAPI;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@ComponentScan({"com.delivery.request"})
public class App 
{
    public static void main( String[] args )
    {
        SpringApplication.run(App.class, args);
    }
}

BlogRepository.java如下:

package me.hiboy.SpringBootRESTAPI;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BlogRepository extends JpaRepository<Blog, Integer> {
    List<Blog> findByTitleContainingOrContentContaining(String text, String textAgain);
}

编辑:

我的application.properties如下:

#spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://mysql-standalone:3306/restapi
spring.datasource.username=sa
spring.datasource.password=<my_password_here>

上传截图错误:

编辑:虽然我已经完全理解教程,但我不明白的是注释:@ComponentScan({"com.delivery.request"})。如果这不包括在内,那么我会收到一个错误:Consider defining a bean of type 'me.hiboy.SpringBootRESTAPI.BlogRepository' in your configuration. 我遵循的教程不包含此注释,我通过遵循一些 SO 帖子来解决这个问题。我想知道 我做了什么不同的事情 以至于需要这个注释。如果您能指出,对我的学习有很大的帮助,将不胜感激!

编辑:我已将整个代码上传到 GitHub。这是一个相当简单直接的应用程序,但我不知道我哪里出错了! :(

此外,根据我之前的问题 here,我不确定 resources 文件夹的位置。目前我的目录结构如下:

我对此表示怀疑,因为我在这里描述的所有这些问题都是在我将 MySQL 数据库 与此应用程序集成后 才开始的。如果我只是对值进行硬编码,那么 API 查询就可以正常工作(我没有得到 404)。我也很怀疑,因为虽然我在 application.properties 文件中提到了端口 8086,但它(WhiteLabel 错误)仍然在端口 8080 上启动。谢谢!

正如chat/comments部分所讨论的,我只是总结一下作为答案。

resources 文件夹应与 java 文件夹平行存在 src/main 并应标记为资源。

此外,在App.java

中评论以下内容
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@ComponentScan({"com.delivery.request"})

确保在 application.properties 文件下更新密码。

现在应该可以了。

此外,请确保 java 版本在运行时和编译时都与编译器兼容。