java - 如何解决下面给出的与邮递员相关的错误?
问题描述
FileEntity.java -Java Pojo 类携带数据。
@Entity
//table name
@Table(name = "file_details")
public class FileEntity {
@Id
@GeneratedValue
private String file_id;
private String user_id;
private String file_name;
public String getFile_id() {
return file_id;
}
public void setFile_id(String file_id) {
this.file_id = file_id;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getFile_name() {
return file_name;
}
public void setFile_name(String file_name) {
this.file_name = file_name;
}
@Override
public String toString() {
return "File_Details [file_id=" + file_id + ", user_id=" + user_id + ", file_name=" + file_name + "]";
}
}
文件存储库.java
@Repository
public interface FileRepository extends JpaRepository<FileEntity, String> {
@Query("select file from file_details file where file.user_id = ?1")
List<FileEntity> findByUserId(String user_id);
}
MainController.java 控制数据流的控制器
//Post request to upload file to the google drive and get id of the file uploaded to the drive
@PostMapping(value = "/upload/{user_id}")
public ResponseEntity<FileEntity> uploadFIle(FileEntity fileEntity,@RequestParam("file") MultipartFile file,@PathVariable String user_id){
//here I am getting field which I have stored on google drive
String fileId = fileManager.uploadFile(file);
//Here I am passing field id and userid which I want to store in db
FileEntity updated = fileManager.createOrUpdateFile(fileEntity,fileId,user_id);
return new ResponseEntity<FileEntity>(updated, HttpStatus.OK);
}
FileManager.java - 包含各种功能的服务类。
public class FileManager {
@Autowired
private GoogleDriveManager googleDriveManager;
@Autowired
FileRepository fileRepository;
上传文件功能
public String uploadFile(MultipartFile file) {
try {
//String folderId = getFolderId(filePath);
if (file != null) {
File fileMetadata = new File();
//fileMetadata.setParents(Collections.singletonList(folderId));
fileMetadata.setName(file.getOriginalFilename());
File uploadFile = googleDriveManager.getInstance()
.files()
.create(fileMetadata, new InputStreamContent(
file.getContentType(),
new ByteArrayInputStream(file.getBytes()))
)
.setFields("id").execute();
String fileId = uploadFile.getId();
return fileId;
}
} catch (Exception e) {
System.out.print("Error: "+e);
}
return null;
}
createOrUpdateFile函数将数据存储到 db
public FileEntity createOrUpdateFile(FileEntity fileEntity, String fileId, String user_id) {
Optional<FileEntity> employee = fileRepository.findById(fileEntity.getFile_id());
if(employee.isPresent())
{
FileEntity newEntity = employee.get();
newEntity.setFile_id(fileId);
newEntity.setUser_id(user_id);
newEntity.setFile_name(fileEntity.getFile_name());
newEntity = fileRepository.save(newEntity);
return newEntity;
} else {
fileEntity = fileRepository.save(fileEntity);
return fileEntity;
}
}
该项目是将文件上传到google drive,并获取标识存储在google drive中的文件的id。而且我们还想查看每个用户上传的文件,所以这里我们将文件ID和用户ID存储到数据库中以查看文件。
解决方案
问题是您希望在您的控制器FileEntity fileEntity
中传递您的方法。uploadFIle()
但这是不可能的,因为 aFileEntity
是您要创建的内容,并且您永远不会在 REST 调用中添加此类信息。此外,您无缘无故地使方法复杂化。它应该只在你的类中调用一个方法,FileManager
如下所示:
@PostMapping(value = "/upload/{user_id}")
public ResponseEntity<FileEntity> uploadFIle(@RequestParam("file") MultipartFile file,@PathVariable String user_id){
FileEntity updated = fileManager.uploadFile(file, user_id);
return new ResponseEntity<FileEntity>(updated, HttpStatus.OK);
}
您的FileManager.updloadFile()
方法应该处理好所有事情:将文件上传到 Google Drive 并将其信息存储在数据库中。正是这个方法实际创建了一个FileEntity
对象,而不是 Controller 方法:
public class FileManager {
(...)
public FileEntity uploadFile(MultipartFile file, String user_id) {
try {
//String folderId = getFolderId(filePath);
if (file != null) {
String fileName = file.getOriginalFilename();
File fileMetadata = new File();
//fileMetadata.setParents(Collections.singletonList(folderId));
fileMetadata.setName(fileName);
File uploadFile = googleDriveManager.getInstance()
.files()
.create(fileMetadata, new InputStreamContent(
file.getContentType(),
new ByteArrayInputStream(file.getBytes()))
)
.setFields("id").execute();
String fileId = uploadFile.getId();
return storeNewFileData(fileId, fileName, user_id);
}
} catch (Exception e) {
System.out.print("Error: "+e);
}
return null;
}
private FileEntity storeNewFileData(String fileId, String fileName, String user_id) {
FileEntity newEntity = new FileEntity();
newEntity.setFile_id(fileId);
newEntity.setUser_id(user_id);
newEntity.setFile_name(fileName);
return fileRepository.save(newEntity);
}
// You could add here another method for the update of an existing file, but trying to joining both in a simple method does not seem right to me and makes the code harder to read
(...)
}
推荐阅读
- python - 当我运行命令时,Python tkinter 不会打印小数点
- javascript - 验证带有特殊字符的密码
- r - 最近 R 从 3.5.2 更新到 4.0.1 后,因子变量在数据框中显示为字符变量
- javascript - 如何在不向 DOM 渲染任何内容的情况下计算文本高度?
- python - 如何判断 C++ exe 是否已被另一个程序显式调用
- javascript - 你怎么知道什么时候是 Javascript 函数,什么时候是 jQuery 函数
- azure - Microsoft.WindowsAzure.Storage.StorageException:“已经存在租约。”
- r - 在 rstanarm/bayesplot 图中设置单个颜色,而不是配色方案
- python - 如何从弹性滚动结果中更快地构建熊猫数据框?
- image - Spring Boot 中的图像服务列表