查看原文
其他

Springboot与Elasticsearch完美结合

SpringForAll社区 SpringForAll社区 2021-05-26

前言

在前面一篇已经写了elasticsearch的环境的搭建,那么这一篇就写下springboot与elasticsearch环境的整合。如果没有搭建环境,请参考:Spring Boot整合Elasticsearch

项目生成

1 像之前一样,访问 start.spring.io,选择对应组件完成,如下图

  • 2 生成项目后导入idea

代码编写

  • 需求描述:我们利用es做一个简单的用户添加获取的功能。

1、编写用户类

  1. @Document(indexName = "user", type = "student")

  2. public class UserInfo implements Serializable{

  3. private String id;

  4. private String username;

  5. private int age;


  6. public String getId() {

  7. return id;

  8. }


  9. public void setId(String id) {

  10. this.id = id;

  11. }


  12. public String getUsername() {

  13. return username;

  14. }


  15. public void setUsername(String username) {

  16. this.username = username;

  17. }


  18. public int getAge() {

  19. return age;

  20. }


  21. public void setAge(int age) {

  22. this.age = age;

  23. }


  24. @Override

  25. public String toString() {

  26. return "UserInfo{" +

  27. "id='" + id + '\'' +

  28. ", username='" + username + '\'' +

  29. ", age=" + age +

  30. '}';

  31. }

  32. }

  • 此处id属性必须有,或者改为别的如userId属性,必须添加@Id注解,并且必须为String类型,这是因为后面UserRepository需要泛型为第一个参数为bean的类型,第二个参数为id

  • Spring-data-elasticsearch为我们提供了@Document、@Field等注解,如果某个实体需要建立索引,只需要加上这些注解即可

这是一个简单的用户类,并且生成了getter,setter方法。

2、dao的编写这里我们采用jpa的方式整合es,使用接口,继承ElasticsearchRepository,如下

  1. @Repository

  2. public interface UserRepository extends ElasticsearchRepository<UserInfo,String> {

  3. }

  4. ```


  5. - service的编写


  6. ```

  7. @Service

  8. public class Uservice {

  9. @Autowired

  10. UserRepository userRepository;

  11. public UserInfo getById(String id){

  12. return userRepository.findOne(id);

  13. }


  14. public void save(UserInfo userInfo){

  15. userRepository.save(userInfo);

  16. }


  17. }

  • controller的编写 这里直接使用rest风格的接口

  1. @RestController

  2. public class UserController {

  3. Logger logger = LoggerFactory.getLogger(this.getClass());

  4. @Autowired

  5. UserInfoService userInfoService;

  6. @GetMapping("/user/{id}")

  7. public UserInfo get(@PathVariable String id){

  8. UserInfo userInfo = userInfoService.getById(id);

  9. logger.info("---${user}:{}",userInfo.toString());

  10. return userInfo;

  11. }


  12. @PostMapping("/user/create/{id}")

  13. public UserInfo create(@PathVariable String id,@RequestBody UserInfo userInfo){

  14. userInfo.setId(id);

  15. userInfoService.save(userInfo);

  16. return userInfo;

  17. }

  18. }

这里只简单的编写了一个添加和一个获取的方法,接下来我们运行项目 抛出了一个异常,如下

  1. java.lang.ClassNotFoundException: com.sun.jna.Native

  2. at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_111]

  3. at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_111]

  4. at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_111]

  5. at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_111]

  6. at java.lang.Class.forName0(Native Method) ~[na:1.8.0_111]

  7. at java.lang.Class.forName(Class.java:264) ~[na:1.8.0_111]

这是是jna包的原因,我们将此jar添加到pom.xml

  1. <dependency>

  2. <groupId>net.java.dev.jna</groupId>

  3. <artifactId>jna</artifactId>

  4. <version>4.4.0</version>

  5. </dependency>

  • 测试 我们先利用postman做一个接口测试,如下图 测试成功,已经将数据添加到es中。

  • 获取 至此,es的添加和获取已经完成,后期es的更深入的东西后期请持续关注。


推荐:一起了解下Java多线程基础

上一篇:人人都是 API 设计者:我对 RESTful API、GraphQL、RPC API 的思考

点击原文阅读更多


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存