有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java向对象动态添加传统字段

我有一个spring服务,它以.json的形式返回用户数据

这是公开的。阶级

import lombok.Data;
import org.hibernate.annotations.CreationTimestamp;

import java.util.Date;
import java.util.HashSet;

@Data
public class ArticleUserPublic {
    private String username;
    private HashSet<Integer> favorites;

    @CreationTimestamp
    private Date created_at;
}

返回的数据格式如下:

{
      "username": "admin",
      "favorites": [
        1,
        2,
        3
      ],
      "created_at": "2021-03-17T13:44:10.206+00:00"
    }

如何在不修改ArticleUserPublic类的情况下附加额外的“message”字段? 还有更多像UserData这样的类,我想附加这个消息或其他东西

我想要实现的是:

{
      "message": "User exist!",
      "username": "admin",
      "favorites": [
        1,
        2,
        3
      ],
      "created_at": "2021-03-17T13:44:10.206+00:00"
    }

我目前的解决方案,也许可以做得更好,目前它以嵌套方式添加对象,我想将其更改为根级别:

自定义消息类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CustomMessage<Obejct>  {
    private String message;
    private boolean status;
    private HashMap<String, Obejct> data = new HashMap<>();

    public CustomMessage(String message) {
        this.message = message;
    }

    public void add(String key, Object t){
        this.data.put(key, (Obejct) t);
    }

如何将其他消息添加为HashMap元素:

    public CustomMessage<Object> getUser(Long userId) {
        var response = new CustomMessage<>();
        Optional<ArticleUser> user = userRepository.findById(userId);
        if (user.isPresent()) {
            response.setMessage("User found!");
            response.setStatus(true);

            ArticleUserPublic publishUser = new ArticleUserPublic();
            publishUser.setUsername(user.get().getUsername());
            publishUser.setFavorites(user.get().getFavorites());
            publishUser.setCreated_at(user.get().getCreated_at());
            response.add("data", publishUser);
        } else {
            response.setMessage("User not found");
            response.setStatus(false);
        }
        return response;
    }

共 (1) 个答案

  1. # 1 楼答案

    您可以扩展类ArticleUserPublic,并添加其他字段。例如:

    @Data
    public class ArticleWithMessage extends ArticleUserPublic {
      private String message;
      private String otherFields;
    
      ArticleWithMessage(ArticleUserPublic article){
        super(article);
      }
    
     ArticleWithMessage(){
      }
    
    }
    

    然后像这样使用:

    public ArticleWithMessage getUser(Long userId) {
        Optional<ArticleUser> user = userRepository.findById(userId);
        if (user.isPresent()) {
            ArticleWithMessage fullUserArticle = new ArticleWithMessage(user.get());
            fullUserArticle.setMessage("User found!");
            fullUserArticle.setStatus(true);
            fullUserArticle.setUsername(user.get().getUsername());
            fullUserArticle.setFavorites(user.get().getFavorites());
            fullUserArticle.setCreated_at(user.get().getCreated_at());
            fullUserArticle.add("data", publishUser);
            return fullUserArticle;
        } else {
            ArticleWithMessage noUser = new ArticleWithMessage();
            noUser.setMessage("User not found");
            noUser.setStatus(false);
            return noUser;
        }
    
      return response;
    }