我是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) {...}
另一个问题是你没有任何getters
和setters
在你的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之间没有映射