RESTfull 中的 POST 方法与 sql 或 Statement 生成 id 的问题?

问题描述

GET、PUT 和 DELETE 可以工作,但是尝试执行 POST 方法却不起作用。在我的数据库中,'usuario' 有一个 id、一个名字和一个年龄 (edad)。

@POST
@Consumes({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
public Response crearUsuario(Usuario usuario) {
    try {
        String sql = "INSERT INTO `RedLibros`.`usuario`(`nombre`,`edad`) " + "VALUES('"
    + usuario.getnombre() + "','" + usuario.getedad() + "');";
        
        PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
        int affectedRows = ps.executeUpdate();
        
        ResultSet generatedID = ps.getGeneratedKeys();
        if (generatedID.next()) {
            usuario.setidusuario(generatedID.getInt(1));
            String location = uriInfo.getAbsolutePath() + "/" + usuario.getidusuario();
            return Response.status(Response.Status.CREATED).entity(usuario).header("Location",location).header("Content-Location",location).build();
        }
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("No se pudo crear el usuario").build();
        
    } catch (sqlException e) {
        return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("No se pudo crear el usuario\n" + e.getStackTrace()).build();
    }
}

我正在使用 Postman,我的输入内容是:

</usuario idusuario="1">
       <edad>43</edad>
       <nombre>George</nombre>
</usuario>

错误是:Ljava.lang.StackTraceElement;@1aeb297

And this is the script of my db,im not sure if its because the character set,im using UTF-8.

-- MysqL Script generated by MysqL Workbench
-- lun 19 abr 2021 14:13:50 CEST
-- Model: New Model    Version: 1.0
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS,UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0;
SET @OLD_sql_mode=@@sql_mode,sql_mode='TradITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema RedLibros
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `RedLibros` DEFAULT CHaraCTER SET utf8 COLLATE utf8_general_ci ;
USE `RedLibros` ;

-- -----------------------------------------------------
-- Table `RedLibros`.`usuario`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `RedLibros`.`usuario` (
  `idusuario` INT NOT NULL,`nombre` VARCHAR(45) NULL,`edad` VARCHAR(45) NULL,PRIMARY KEY (`idusuario`))
ENGINE = InnoDB;

解决方法

我认为您没有通过 POST 调用传递 idusuario。如果您希望这是自动增量,那么您需要相应地定义表。您应该使用如下所示的 auto_increment 语法 -

CREATE TABLE IF NOT EXISTS RedLibros.usuario ( idusuario INT NOT NULL AUTO_INCREMENT,nombre VARCHAR(45) NULL,edad VARCHAR(45) NULL,PRIMARY KEY (idusuario));