【问题标题】:Spring boot application not accepting ID of incoming POST requestSpring Boot 应用程序不接受传入 POST 请求的 ID
【发布时间】:2021-07-17 20:36:19
【问题描述】:

我有一个现有系统,它为用户使用基于字符串的唯一 ID,我想将该系统转移到 Spring 引导应用程序中。我想创建一个用户,所以我发送一个包含以下内容的 POST 请求:

如您所见,id 被忽略。 这是我的用户类 Spring 代码:

@PostMapping("/user")
    ResponseEntity addUser(User receivedUser) {
        Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
        logger.info("Empfangener User: " + receivedUser.toString());
        try {
            User mailCheckUser = userService.getUserByMail(receivedUser.getEmail());
            User nameCheckUser = userService.getUserByName(receivedUser.getUsername());

            if (mailCheckUser != null){
                return new ResponseEntity("Email already exists", HttpStatus.NOT_ACCEPTABLE);
            }
            if (nameCheckUser != null){
                return new ResponseEntity("Username already exists", HttpStatus.NOT_ACCEPTABLE);
            }
            userService.addUser(receivedUser);
        } catch (Exception userCreationError) {
            return new ResponseEntity(receivedUser, HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return new ResponseEntity(receivedUser, HttpStatus.OK);
    }


public void addUser(User user) {
        userRepository.save(user);
    }

这是我的用户类:

@Entity
@Table
public class User {
    @Id
    @Column(unique =true)
    private String id;
    private @Column(unique =true)
    String username;
    private  @Column(unique =true)
    String email;
    private  @Column(unique =true)
    String simpleAuthToken;
    private
    String password;
    /*REDACTED*/
    private
    boolean isBlocked;

    public User(String id, String name, String email, boolean isBlocked) {
        this.id = id;
        this.username = name;
        this.email = email;
        this.simpleAuthToken = simpleAuthToken;
        this.isBlocked = false;
    }

    public User() {

    }
    /*GETTERS AND SETTERS ARE HERE, BUT I CUT THEM FOR SPACING REASONS*/
}

这是 Spring 输出:

我的预期结果是 Spring 会识别该 id,然后使用我提供的 id 创建一个用户。为什么id总是为空?

编辑:如果我将 ID 放入 Put 或 Get Mapping 作为 Path 变量,如下所示:

@PutMapping("/user/{id}")
ResponseEntity updateUser(@PathVariable String id, User receivedUser) {}

然后它会被读取和识别,但它在receivedUser中仍然为空

【问题讨论】:

  • 您是否尝试过在User 构造函数和setId 中删除断点以查看spring 是如何构造实体的?我以为它会调用无参数构造函数和设置器。
  • 刚刚这样做了,spring 确实使用了空构造函数。这让我想知道用户名是如何进入用户的。有没有办法强制spring使用args构造函数?
  • 我认为它是使用无参数构造函数构造一个空对象,然后使用设置器。您是否在 setUsername 和 setId 中放置了断点?我的问题是 setId 出了什么问题。
  • 我没有设置用户名或 ID,因为我的 userService.addUser 所做的只是将用户保存到存储库(它可以工作,但 id 为 null 是问题)。删除 no args 构造函数后,id 被正确读取,但我仍然收到内部服务器错误。我目前正在调查
  • 我忘了删除默认构造函数会导致发送 GET 请求时出现异常。如您所见,我的构造函数已经设置了一些值,但没有被使用。您知道为什么会发生这种情况吗?

标签: spring spring-boot spring-data-jpa


【解决方案1】:

首先在post请求正文中添加@RequestBody。在 Post 请求 (/test/user) 中,您传递了一些参数,但在方法级别未收到。

如果您想从邮递员那里接收 id,请在方法级别添加 @RequestParam("id")String id

您如何通过手动或某些生成器生成唯一 ID? 并在数据库控制台级别仔细检查用户 ID。

【讨论】:

  • 每个 id 都是由另一个系统唯一生成的,因此使用它来识别。使用 @BodyRequest 标记会引发错误 Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=utf-8' not supported] on Requesting something
猜你喜欢
  • 2023-03-19
  • 2020-06-19
  • 2016-07-29
  • 2017-08-03
  • 2019-04-15
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2017-08-10
相关资源
最近更新 更多