如何使用 crudrepository 在 spring boot 中保存对象数组?

How to save array of object in sprig boot with crudrepository?

我是 Spring 引导的新手,这是我的第一个 spring 虚拟项目,我正在尝试学习在 mysql-db 中保存对象数组。

实际上,我正在尝试在我的控制器中使用 crudRepository 中的 saveAll 方法。但它给我一个错误 no instance(s) of type variable(s) S exist so that Iterable<S> conforms to List<User>

我的 JSON 看起来像这样:

[
    {
        "first_name": "Jack",
        "last_name": "Jill",
        "email": "jacjill@gmail.com",
        "password": "passq3623"
    },
    {
        "first_name": "John",
        "last_name": "Doe",
        "email": "john@gmail.com",
        "password": "pass23"
    }
]

这是我的实体class

package com.example.testbatch.Entities;

import javax.persistence.*;

@Entity
@Table(name = "user")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int id;
    public String first_name;
    public String last_name;
    public String email;
    public String password;
}

这是我的用户模型Class

package com.example.testbatch.Models;

public class User {
    public int id;
    public String firstName;
    public String lastName;
    public String email;
    public String password;
}

这是我的存储库

package com.example.testbatch.Repositories;

import com.example.testbatch.Entities.UserEntity;
import org.springframework.data.repository.CrudRepository;

import java.util.List;

public interface UserRepository extends CrudRepository<UserEntity, Integer> {
    @Override
    List<UserEntity> findAll();

}

这是我的休息控制器

package com.example.testbatch.Controllers;

import com.example.testbatch.Entities.UserEntity;
import com.example.testbatch.Models.User;
import com.example.testbatch.Repositories.UserRepository;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/api/v1/user")
public class UserController {

    @Autowired
    UserRepository userRepository;



    @PostMapping("/register")
    public void saveUsers(@RequestBody UserEntity userEntity) {
        List<User> persistedUser = userRepository.saveAll(List.of(userEntity));
    }


}

谁能帮帮我?这是我第一次使用 spring boot

user_repo 正在返回一个 UserEntity 类型的列表 在您的控制器中,您要求提供 User

类型的列表

UserEntity 和 User 之间没有映射。

您的代码有一些问题:

一开始你有一个DTOUserclass),所以,你应该使用这个DTO 在你的控制器中使用 saveUsers 方法,更重要的是 你在你的 JSON 中传递了一个对象数组,所以你必须使用 List 而不是 Object 作为参数:

public void saveUsers(@RequestBody List<User> users) {...}

另一个问题是你的 DTO (public class User) 和 Entity (public class UserEntity) classes 中没有任何 getterssetters并且您还必须在 DTO class 中添加一个方法,用于 mapping DTO实体:

public class User {
    ...
    public static UserEntity dtoToEntity(User user){
        UserEntity userEntity = new UserEntity();
        userEntity.setEmail(user.getEmail());
        userEntity.setPassword(user.getPassword());
        userEntity.setFirst_name(user.getFirstName());
        userEntity.setLast_name(user.getLastName());
        return userEntity;
    }
}

此外,您还必须更改 JSON 属性以匹配 DTO 的属性:

[
    {
        "firstName": "Jack",
        "lastName": "Jill",
        ...
    },
    ...
]

作为最后一个,将您的控制器 saveUsers 方法更改为(saveAll 方法 return Iterable 而不是 List):

@PostMapping("/register")
public void saveUsers(@RequestBody List<User> users) {

    List<UserEntity> userEntities = new ArrayList<>();

    for (User user : users) {
        userEntities.add(dtoToEntity(user));
    }

    Iterable<UserEntity> persistedUser = userRepository.saveAll(userEntities);
}

注意: 有一点请记住,因为你的 实体中有 auto-generated id,所以你的 DTO 不需要 id 属性,显然是因为它是 auto-generated,你不需要从输入中获取它;