java - 如何向 "/users?<some-query-here>"发出 GET 请求,然后在 JSON 数组中返回所有满足查询条件的用户

标签 java spring spring-boot api rest

老读者,第一次张贴者。

我需要帮助。我无法弄清楚 URL 参数 ↔ 数据库。

情况: 我将 .../users/?role=admin&title=manager 放入 postman

预期: 所有作为经理和管理员的用户的 json。

实际: 我的电脑爆炸了。

@RestController
@RequestMapping(path = USERS_PATH)
@Log4j2
public class UserController
// other code...
  @GetMapping
  public ResponseEntity<List<User>>  getUserQuery(
      @RequestParam( required = false, name = "name") String name,
      @RequestParam( required = false, name = "title") String title,
      @RequestParam( required = false, name = "roles") String roles,
      @RequestParam( required = false, name = "email") String email,
      @RequestParam( required = false, name = "password") String password
  ) {
    log.info("Request received for getUserQuery");
    return new ResponseEntity<>(userService.doSomething???(), HttpStatus.OK); // stuff I don't understand yet)
  }

我的问题: 在 Controller 之后,什么进入了 UserService 和 UserRepository?

额外信息: 我正在使用 Spring Boot 和 H2,但稍后可能需要切换到 PostgreSQL 数据库。

我有下面的代码来检查在服务层上的放置和发布期间是否有唯一的电子邮件,但我无法得到类似的东西来解决这个问题。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

  @Query("SELECT u FROM User u WHERE u.email = ?1")
  Optional<User> findUserByEmail(String email);
}

咆哮: 这似乎是一件非常普遍的事情,我应该已经知道该怎么做了。我不。我已经在互联网上阅读了大约 5 个小时。仍然没有回答。我学习了有关规范、Querydsl、@ModelAtribute、DAO 和映射 RequestParams 的知识。但是,我找不到如何连接这些点。所以,我完全成为穴居人并尝试使用 StringBuilder 和一堆逻辑制作一个 @Query 参数......我开始螺旋上升。

无论如何,我想避免规范和 Querydsl。只需使用 @Query 和 JPA,但更重要的是,我想要一个干净的解决方案/最佳实践。

最佳答案

这是一个工作片段。我认为您的存储库有问题。您正在使用 @Query 以及开箱即用的查询支持。

服务和存储库中的内容:存储库层 (repo) 类用于抽象与数据库的交互。

服务层与存储库层交互,并对存储库层返回的数据进行处理。

用户实体

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.*;

@Getter
@Setter
@Entity
@Table(name = "users")
@NoArgsConstructor
public class UserEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "designation")
    private String designation;

    @Column(name = "email")
    private String email;



}

用户存储库

import com.example.code.entity.UserEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {

    Optional<UserEntity> findByName(String name);

    List<UserEntity> findByDesignation(String designation);

    Optional<UserEntity> findByEmail(String email);
}

用户服务

import java.util.Collection;

public interface UserService {
    void createUser(UserDTO userDTO);

    Collection<UserDTO> getUsers(
            String username,
            String designation,
            String email
    );
}

UserServiceImpl

import com.example.code.dto.UserDTO;
import com.example.code.entity.UserEntity;
import com.example.code.mapper.UserMapper;
import com.example.code.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.apache.catalina.User;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {

    private final UserRepository userRepository;

    @Override
    public void createUser(UserDTO userDTO) {
        UserEntity userEntity = new UserEntity();
        userEntity.setName(userDTO.getName());
        userEntity.setDesignation(userDTO.getDesignation());
        userEntity.setEmail(userDTO.getEmail());
        userRepository.save(userEntity);
    }

    @Override
    public Collection<UserDTO> getUsers(String username, String designation, String email) {
        Set<UserDTO> userDTOS = new HashSet<>();
        if( !username.isBlank() && !username.isEmpty() && userRepository.findByName(username).isPresent() ) {
            userDTOS.add(UserMapper.toDto(
                    userRepository.findByName(username).get()
            ));
        }
        if(!designation.isBlank() && !designation.isEmpty()) {
            userDTOS.addAll(
                    userRepository.findByDesignation(designation)
                            .stream()
                            .map(UserMapper::toDto)
                            .collect(Collectors.toSet())
            );
        }

        if( !email.isBlank() &&
                !email.isEmpty() &&
                userRepository.findByEmail(email).isPresent() ) {
            userDTOS.add(UserMapper.toDto(
                    userRepository.findByEmail(email).get()
            ));
        }

        return userDTOS;
    }
}

用户映射器

import com.example.code.dto.UserDTO;
import com.example.code.entity.UserEntity;

public class UserMapper {

    public static UserDTO toDto(UserEntity entity) {
        UserDTO userDTO = new UserDTO();
        userDTO.setName(entity.getName());
        userDTO.setDesignation(entity.getDesignation());
        userDTO.setEmail(entity.getEmail());
        return userDTO;
    }
}

测试 Controller

@RestController
@RequestMapping("/test")
@RequiredArgsConstructor
public class TestController {

    private final UserService userService;

    @PostMapping
    public ResponseEntity<String> createUser(@RequestBody final UserDTO userDTO) {
        try {
            userService.createUser(userDTO);
        }catch (Exception e) {
            return ResponseEntity.internalServerError().body("Failure");
        }
        return ResponseEntity.ok("Success");
    }

    @GetMapping
    public ResponseEntity<Collection<UserDTO>> getUsers(
            @RequestParam(value = "name", required = false) String name,
            @RequestParam(value = "designation", required = false) String designation,
            @RequestParam(value = "email", required = false) String email
    ) {
        return ResponseEntity.ok(userService.getUsers(name, designation, email));
    }
}

关于java - 如何向 "/users?<some-query-here>"发出 GET 请求,然后在 JSON 数组中返回所有满足查询条件的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70241010/

相关文章:

java - 当为任何参数定义模拟构造函数时,PowerMockito 返回 null

java - 使用 Spring Boot 从 http 链接获取值

spring - 通过 Spring redisTemplate.keys() 限制集合返回大小的任何方法

java - Spring Boot 和 OAuth2 : redirect url over reverse proxy

java - SOAP:如何在 Java 中调用 CountryInfoService WSDL 文件,例如使用 CapitalCity SOAP 操作

java - 确定上下文是否是特定 Activity

java - Gradle build - 添加模块路径

带有两个 jar 的 docker 中的 Spring Boot

java - 是否有一个公共(public)位置包含所有 Spring XML 的声明

java - Spring Security OAuth2 - @EnableOauth2Sso 但也接受 token 作为身份验证