首页 > 解决方案 > 如何解决下面给出的与邮递员相关的错误?

问题描述

在此处输入图像描述如何解决下面给出的错误?

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存储到数据库中以查看文件。

标签: javaspring-bootspring-data-jpa

解决方案


问题是您希望在您的控制器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

    (...)
}

推荐阅读