REST API查询返回404?

时间:2018-04-19 01:10:23

标签: java spring-boot http-status-code-404

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

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>

上传错误的屏幕截图:

enter image description here

编辑:虽然我完全理解了教程,但我无法理解的是注释:@ComponentScan({"com.delivery.request"})。如果没有包含这个,那么我会收到一个错误:Consider defining a bean of type 'me.hiboy.SpringBootRESTAPI.BlogRepository' in your configuration.我所遵循的教程不包含这个注释,我通过跟踪一些SO帖子来解决这个问题。我想知道我做了哪些不同以便需要这个注释。如果你能指出,这对我的学习有很大帮助,我将非常感激!

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

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

Directory structure

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

1 个答案:

答案 0 :(得分:1)

正如聊天/评论部分所述,我只是将这些要点总结为答案。

资源文件夹应与 src / main 下的 java 文件夹并行显示,并且应标记为资源。

另外,请在App.java中注释以下内容

@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@ComponentScan({"com.delivery.request"})

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

现在应该可以了。

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