如何保存在sprig引导与crudrepository对象数组?



我是Spring boot的新手,这是我的第一个Spring dummy项目,我试图学习在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"
}
]

这是我的实体类

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;
}

这是我的用户模型类

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();
}

这里是rest控制器

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

你的代码有一些问题:

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

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

另一个问题是你没有任何getterssetters在你的DTO (public class User)和实体(public class UserEntity)类,你也必须添加一个方法在你的DTO映射totoEntity:

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方法返回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);
}

注意:作为一个点记住,因为你在你的Entity中有自动生成的id,所以你不需要id属性为DTO,显然因为它是自动生成的,你不需要从输入中获取它;

user_repo返回一个UserEntity类型的List而在控制器中,您正在请求类型为User

的ListUserEntity和User之间没有映射

最新更新