使用 Spring Data JPA 在 Spring Boot 2 应用程序中发布数据

Posted

技术标签:

【中文标题】使用 Spring Data JPA 在 Spring Boot 2 应用程序中发布数据【英文标题】:Posting data in a Spring Boot 2 Application with Spring Data JPA 【发布时间】:2020-02-26 09:34:39 【问题描述】:

我正在尝试通过带有 Spring Data JPA 的 Spring Boot 2 应用程序将来自邮递员的数据发布到 mysql 数据库中。我得到的只是 404 错误。

主要

@SpringBootApplication
public class ProfileApplication 

    public static void main(String[] args) 
        SpringApplication.run(ProfileApplication.class, args);
    


实体

@Entity
public @Data class Profile 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String profileText;

控制器

@RestController
@RequestMapping(value = "/profile", produces =  MediaType.APPLICATION_JSON_VALUE )
public class ProfileController 

    @Autowired
    private ProfileRepository profileRepository;

    public ProfileRepository getRepository() 
        return profileRepository;
    

    @GetMapping("/profile/id")
    Profile getProfileById(@PathVariable Long id) 
        return profileRepository.findById(id).get();
    

    @PostMapping("/profile")
    Profile createOrSaveProfile(@RequestBody Profile newProfile) 
        return profileRepository.save(newProfile);
    

存储库

public interface ProfileRepository extends CrudRepository<Profile, Long> 


application.properties

server.port = 8080
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/profiledb
spring.datasource.username=root
spring.datasource.password=
server.servlet.context-path=/service

【问题讨论】:

你有没有在你的机器上本地运行你的mysql服务器实例? 请在问题中添加邮递员的卷曲或截图。 @MohsenAbasi MySQL 在本地是 tunnint。 404 表示找不到你调用的api。也许您使用了错误的路径。 看看@Alexandru Somai 的回答。 【参考方案1】:

似乎在您的ProfileController 中,您定义了两次profile 端点(第一次在类级别,第二次在方法级别)。解决方案是删除其中一个:

@RestController
@RequestMapping(value = "/profile", produces =  MediaType.APPLICATION_JSON_VALUE )
public class ProfileController 

    @Autowired
    private ProfileRepository profileRepository;

    public ProfileRepository getRepository() 
        return profileRepository;
    

    // Notice that I've removed the 'profile' from here. It's enough to have it at class level
    @GetMapping("/id")
    Profile getProfileById(@PathVariable Long id) 
        return profileRepository.findById(id).get();
    

    // Notice that I've removed the 'profile' from here. It's enough to have it at class level
    @PostMapping
    Profile createOrSaveProfile(@RequestBody Profile newProfile) 
        return profileRepository.save(newProfile);
    

【讨论】:

如果他想调用 /service/profile/profile 这不是错误(即使谈论 api 设计很糟糕)。 你是对的。由于他没有提及他提出的要求,我认为他只想打电话给/service/profile。 (我会更新我的答案以包含它) 我实现了您编辑的代码@AlexandruSomai。现在可以了。【参考方案2】:

哪个网址?有效网址必须如下所示:

获取:http://localhost:8080/service/profile/profile/1

发帖:http://localhost:8080/service/profile/profile

【讨论】:

以上是关于使用 Spring Data JPA 在 Spring Boot 2 应用程序中发布数据的主要内容,如果未能解决你的问题,请参考以下文章

java学习之spring data jpa

负载平衡 (ribbon) 和路由 (zuul) Spring REST API (Spring Data JPA) 请求到同一服务的多个副本

看Spring Data如何简化数据操作

Spring+Hibernate+JPA的多数据库

Spring Boot(17)——使用Spring Data JPA

Spring Data 系列 Spring+JPA(spring-data-commons)