如何使用 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 之间没有映射。
您的代码有一些问题:
一开始你有一个DTO(User
class),所以,你应该使用这个DTO 在你的控制器中使用 saveUsers
方法,更重要的是 你在你的 JSON 中传递了一个对象数组,所以你必须使用 List
而不是 Object
作为参数:
public void saveUsers(@RequestBody List<User> users) {...}
另一个问题是你的 DTO (public class User
) 和 Entity (public class UserEntity
) classes 中没有任何 getters
和 setters
并且您还必须在 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,你不需要从输入中获取它;
我是 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 之间没有映射。
您的代码有一些问题:
一开始你有一个DTO(User
class),所以,你应该使用这个DTO 在你的控制器中使用 saveUsers
方法,更重要的是 你在你的 JSON 中传递了一个对象数组,所以你必须使用 List
而不是 Object
作为参数:
public void saveUsers(@RequestBody List<User> users) {...}
另一个问题是你的 DTO (public class User
) 和 Entity (public class UserEntity
) classes 中没有任何 getters
和 setters
并且您还必须在 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,你不需要从输入中获取它;