java - 当用户在我的 Spring Web 应用程序上更新他们的个人资料图片并更新他们的个人资料时,属于该用户的列表中的对象将被复制

标签 java mysql spring

我正在使用 Spring 开发 Web 应用程序。

此网络应用程序是一个音乐共享平台。有了它,用户可以注册并创建个人资料,还可以撰写帖子或上传轨道。我有一个具有各种属性的用户模型,例如列表和轨道模型。用户有一个轨道列表(列表),当他们上传轨道时,它会被添加到这个列表中。

我想要的一个功能是让用户上传个人资料图片,我已经创建了允许这样做的方法。但是,当用户上传此图片时,用户列表中的每个轨道都会重复多次。因此,例如,如果用户有一个包含 3 首歌曲的列表,分别称为 A、B、C,当他们上传个人资料图片时,他们的列表可能包含 A、A、A、B、B、B、C、C、C 或其他一些重复次数。此外,每当该用户添加一个新的不相关的帖子时,该列表将继续重复。这总是会在个人资料图片上传之后发生,但不会在之前发生。

下面是我在 Controller 中的方法。这会调用 uploadPic 方法并将文件和当前用户传递给它。

@RequestMapping(value="profilepic", method = RequestMethod.POST)
    public String addProfilePic(@RequestPart(value = "file") MultipartFile file, Model model, Principal principal) {

        String name = principal.getName(); 
        User u = userService.findByUsername(name);

        this.amazonClient.uploadPic(file, u);

        return "redirect:/settings?bio_success";
    }

此方法将图片保存到 AWS S3 存储桶,然后调用服务方法。

public String uploadPic(MultipartFile multipartFile, User u) {
    String fileUrl = "";
    try {
        File file = convertMultiPartToFile(multipartFile);
        String fileName = generateFileName(multipartFile);
        System.out.println(fileName);
        fileUrl = endpointUrl + "/" + picBucketName + "/" + fileName;
        uploadPicTos3bucket(fileName, file);
        file.delete();       
        picService.save(u, fileName);

    } catch (Exception e) {
       e.printStackTrace();
    }
    return fileUrl;
}

服务方法将图片保存在MySQL表中,并调用一个方法来更新用户。 亚马逊客户端.java

@Override
public void save(User u, String fileName) {
    ProfilePic newPic = new ProfilePic();
    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
    newPic.setFileName(fileName);
    newPic.setPublishTime(timestamp);
    newPic.setUser(u);
    profilePicRepository.save(newPic);  
    u.setProfilePic(newPic);
    userService.update(u);
}

用户服务.java

@Override
public void update(User user) {
    user.setPassword(user.getPassword());
    user.setRoles(new HashSet<>(roleRepository.findAll()));
    user.setFname(user.getFname());
    user.setLname(user.getLname());
    user.setFriends(user.getFriends());
    user.setIncomingFriendRequests(user.getIncomingFriendRequests());
    user.setOutgoingFriendRequests(user.getOutgoingFriendRequests());
    user.setProfilePic(user.getProfilePic());
    user.setComments(user.getComments());
    user.setPost(user.getPost());
    user.setTracks(user.getTracks());
    userRepository.save(user);
}

我有其他功能,用户可以像这样更新他们的详细信息,但这个问题不会发生,只会在上传个人资料照片时发生。

当我调试并逐步执行每个方法时,用户更新似乎正确更新,包括轨道数。

我创建了下面的小脚本来尝试找出问题,这个脚本的输出如下。也许这将有助于了解造成这种情况的原因。

        String name = principal.getName(); 
        User u = userService.findByUsername(name);


        this.amazonClient.uploadPic(file, u);
        for (Track t : u.getTracks()) {
            System.out.println(t.getTrackName());
        }

        User user2 = userService.findByUsername(name);
        for (Track t : user2.getTracks()) {
            System.out.println(t.getTrackName());
        }

输出:解放 在红色 皮亚努

解放 解放 解放 解放 解放 解放 解放 解放 解放 在红色 在红色 在红色 在红色 在红色 在红色 在红色 在红色 在红色 皮亚努 皮亚努 皮亚努 皮亚努 皮亚努 皮亚努 皮亚努 皮亚努 皮亚努

因为用户名是唯一的,所以我发现同一个用户,两者的输出应该不一样吗? 有没有人对可能导致这种情况的原因有任何想法。任何帮助将不胜感激!

最佳答案

我已将用户实体中的 List 更改为 Set,这似乎解决了 set 不能重复的问题!

关于java - 当用户在我的 Spring Web 应用程序上更新他们的个人资料图片并更新他们的个人资料时,属于该用户的列表中的对象将被复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50088326/

相关文章:

java - 在 Cubieboard 平台内运行的 Java 代码中执行终端命令获取输出

Java 循环对象

mysql - 在新列中获取以前的列值

spring - 为什么 spring-boot 不监听 logging.path 变量?

java - 将 Java 函数传递给 KFunction

java - 尝试将二维数组顺时针旋转 90 度,但它是逆时针旋转

php - 如何在没有内存耗尽的情况下导出具有数字格式的 100K 记录的 HTML 表格

mySQL 数据类型用于存储带有缩写后缀的数字?

java - Spring 和 Thymeleaf session 属性

java - 无法打开类路径资源 [java/lang/Object.class],因为它不存在