使用 Spring Boot + Mongo DB 创建 RESTful API

论坛 期权论坛 脚本     
匿名技术用户   2021-1-3 16:16   31   0

1. 概述

如今,Web应用程序通常分为两个组件——前端和后端。

随着诸如Angular和React之类的前端技术的日渐普及,后端功能通常作为RESTful API公开。

在本教程中,我们将使用Spring Boot创建RESTful api。同时,通过连接到MongoDB,我们将使用Spring Data MongoDB在我们的应用程序中提供持久性支持。

2. 先决条件

我们需要一套标准工具:

  • Java 8或更高版本生成工具(Maven或Gradle)IDE(IntelliJ或Eclipse)

我们将使用Java 8、Gradle和IntelliJ的组合来实现。

为了快速创建Spring启动应用程序,我们将使用Spring Initializr。另外,我们将安装和配置Mongo DB。

3. 用途

让我们为用户注册应用程序创建RESTful API。 为简单起见,我们仅添加功能来执行CRUD(创建,读取,更新和删除)操作。

创建Spring Boot应用后,我们将创建application.properties带有MongoDB配置详细信息的文件:


spring.data.mongodb.database=springboot_mongo_db

3.1. 本质

首先,我们将创建用户具有基本属性的实体,例如名字、姓、和 电子邮件:


@Getter
@Setter
public class User {
    @Id
    private String id;

    private String firstName;
    private String lastName;
    private String email;
    private String phone;
    private String address;
}

这里,我们使用@Id注释来定义标识符。

同时,我们使用了项目Lombok提供的@Getter和@Setter注释来自动创建getter /setter。

3.2. 储存库

然后,我们将创建UserRepository接口,该接口使用MongoRepository提供的Spring数据对数据库进行基本操作:


public interface UserRepository extends MongoRepository<User, String> {
}

3.3. 服务

接下来,我们将创建一个服务类,为基本的CRUD操作提供业务逻辑。

为此,我们来创建注册定义抽象的接口:


public interface Registration<ID, USER> {
    USER registerUser(USER user) throws Exception;

    USER getUser(ID userId) throws Exception;

    USER updateUser(USER user) throws Exception;

    void deleteUser(ID userId) throws Exception;
}

然后,我们将创建注册Impl类来实现注册接口:


@Service
public class RegistrationImpl implements Registration<String, User> {
    @Autowired
    private UserRepository userRepository;

    @Override
    public User registerUser(User user) throws Exception {
        user = userRepository.save(user);
        return user;
    }

    @Override
    public User getUser(String userId) throws Exception {
        User user = userRepository.findById(userId);
        return user;
    }

    public List<User> getAllUser() throws Exception {
        List<User> users = userRepository.findAll();
        return users;
    }

    @Override
    public User updateUser(User user) throws Exception {
        user = userRepository.save(user);
        return user;
    }

    @Override
    public void deleteUser(String userId) throws Exception {
        if (userId == null) {
            throw new Exception("user id is null");
        } else {
            userRepository.delete(userId);
        }
    }
}

注意,我们已经使用@Service注释将RegistrationImpl类声明为用于Spring引导的服务。另外,我们还使用@Autowired注解来注入UserRepository依赖项。

3.4. 控制器

现在我们已经准备好实体,存储库和服务,我们将创建RegistrationController类公开API:


@RestController
public class RegistrationController {
    @Autowired
    private RegistrationImpl registrationImpl;
}

这里,我们使用@RestController注释将其声明为RESTful API控制器。

首先,我们将添加一个方法registerUser注册用户(创建):


@PostMapping(path = "/registerUser")
public ResponseEntity registerUser(@RequestBody User user) throws Exception {
    HashMap<String, Object> resp = new HashMap<>();
    registrationImpl.registerUser(user);
    resp.put("user", user);
    return new ResponseEntity<>(resp, HttpStatus.OK);
}

瞧,我们已经准备好使用第一个RESTful API来注册用户。

让我们使用以下curl命令尝试一下:

curl -X POST "http://localhost:8080/registerUser" -H "Content-Type: application/json" \
-d '{"email": "xyz@email.com", "firstName": "norman", "lastName": "lewis", "phone": "90909090"}'

然后,我们添加一个方法getUser通过ID搜索用户(读取):


@GetMapping("/getUser" )
public ResponseEntity getUser(@RequestParam("id") String id) throws Exception {
    User user = registrationImpl.getUser(id);
    return new ResponseEntity<>(user, HttpStatus.OK);
}

因此,我们可以使用curl来读取用户:

curl -X GET "http://localhost:8080/getUser?id=5e0a0a393844b64a1548c4d9"

同样,我们可以定义一个方法getAllUser获取所有用户:


@GetMapping("/getAllUser" )
public ResponseEntity getAllUser() throws Exception {
    List<User> users = registrationImpl.getAllUser();
    return new ResponseEntity<>(users, HttpStatus.OK);
}

然后,我们将添加一个方法updateUser更新用户(UPDATE):


@PutMapping(path = "/updateUser")
public ResponseEntity updateUser(@RequestParam("id") String id, @RequestBody User user) 
throws Exception {
    HashMap<String, Object> resp = new HashMap<>();
    registrationImpl.updateUser(user);
    resp.put("user", user);
    return new ResponseEntity<>(resp, HttpStatus.OK);
}

最后,让我们添加一个方法deleteUser删除用户(删除):


@DeleteMapping("/deleteUser")
public ResponseEntity deleteUser(@RequestParam("id") String id) throws Exception {
    registrationImpl.deleteUser(id);
    HashMap<String,String> resp = new HashMap<>();
    resp.put("message", "User is successfully deleted");
    return new ResponseEntity<>(resp, HttpStatus.OK);
}

3.5. 验证

接下来,我们将使用hibernate-validator将bean验证的特性添加到我们的api中。

首先,我们将依赖项添加到build.gradle:

compile group: 'org.hibernate', name: 'hibernate-validator', version: '5.0.0.Final'

然后,我们将向用户实体添加一些诸如@NotNull和@Email之类的注释。


public class User {
    // ...

    @NotNull(message = "First Name is mandatory")
    private String firstName;

    @NotNull(message = "Last Name is mandatory")
    private String lastName;

    @NotNull(message = "Email is mandatory")
    @Email(message = "Not valid email")
    @Indexed(unique=true)
    private String email;

    @NotNull(message = "Phone Number is mandatory")
    private String phone;    
}

接下来,我们将使用ValidatingMongoEventListener在主类- Application中注册为一个bean:


@SpringBootApplication
public class Application {
    @Bean
    public ValidatingMongoEventListener validatingMongoEventListener() {
        return new ValidatingMongoEventListener(validator());
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        return new LocalValidatorFactoryBean();
    }

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

最后,我们将修改registerUser中的方法RegistrationController验证用户对象:


@PostMapping(path = "/registerUser")
public ResponseEntity registerUser(@RequestBody User user) throws Exception {
    HashMap<String, Object> resp = new HashMap<>();
    try {
        registrationImpl.registerUser(user);
    } catch (ConstraintViolationException e) {
        HashMap<String, String> messages = new HashMap<>();
        e.getConstraintViolations().stream().forEach(constraintViolation -> {
            messages.put(
                    constraintViolation.getPropertyPath().toString(),
                    constraintViolation.getMessage());
        });
        resp.put("error", true);
        resp.put("messages", messages);
    }
    resp.put("user", user);
    return new ResponseEntity<>(resp, HttpStatus.OK);
}

就是这样! 我们准备检查验证:

curl -X POST "http://localhost:8080/registerUser" -H "Content-Type: application/json" -d '{"email": "xyz@email.com"}'

在这里,我们没有提供姓、名和电话。所以,答案是:

{"messages":{"firstName":"First Name is mandatory","lastName":"Last Name is mandatory","phone":"Phone Number is mandatory"},"error":true,"user":{"id":null,"firstName":null,"lastName":null,"email":"xyz12@email.com","phone":null,"address":null}}

3.6. Swagger 集成

到目前为止,我们已经使用curl来请求我们的api。现在,我们将整合小号使用Springfox摇2为我们的api文档。

我们所需要做的就是在其中添加Springfox依赖项build.gradle:

compile "io.springfox:springfox-swagger2:2.9.2"
compile 'io.springfox:springfox-swagger-ui:2.9.2'

然后,我们将使用@ EnableSwagger2注释对主类进行注释:


@EnableSwagger2
@SpringBootApplication
public class Application {

    // ...
}

就是这样!我们的API规范已经准备好了,可以通过http://localhost:8080/swaggerui.html访问它。

4. 结论

在本教程中,我们使用SpringBoot和Spring Data Mongo DB为用户注册应用创建了RESTful API。 此外,我们使用Project Lombok减少了Swagger 2文档的样板代码和Springfox API。

整个代码实现都可以在Github上找到。

请让我知道您对此的想法! 谢谢阅读。

原文链接: https://dev.to//smartyansh/create-restful-apis-using-spring-boot-mongo-db-6cf

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP