如何更改对象字段的呈现方式,同时仍保留所述字段的原始值?

How can I change how an objects field is PRESENTED while still retaining the original value of said field?

我正在从事一个项目,该项目涉及使用 JDBC 模板创建 Spring 引导 REST 应用程序以访问我自己创建的数据库 (MySQL)。我正在使用 Postman 来验证端点并通过邮递员使用 JSON 输入数据。我目前的任务是创建一个生成随机 4 位数字的猜谜游戏,非常简单。我的问题是这样的; “ Returns 基于 ID 的特定游戏。确保进行中的游戏不会显示其答案” 我创建了一个满足要求的“入门”方法,但仅限于最基本的级别。一旦对象的字段值更改为“隐藏”,我就无法对对象进行操作,因为它不再是 4 位数字。我想 隐藏 答案,同时仍然能够以功能方式对随机生成的数字进行操作。这是我的基本方法 return:

  @Override
public Game gameById(int id) {
    Game game = gameDao.getGameById(id);
    if (game.getFinished() == false) { // "Hides" the answer
        game.setGameAnswer("Hidden");
    }     
    return game;
}

这是我在应用程序中使用上述代码的方法:

@PostMapping("/guess") 
public ResponseEntity<Game> play( int id, String guess) {
        Game game = service.gameById(id); // Get method
        if (game == null) {
   return new ResponseEntity(null, HttpStatus.NOT_FOUND);
     }
        Round round = new Round();
        round.setGuess(guess);
        service.guess(round, game);
        return ResponseEntity.ok(game);
    }

有什么想法吗?

编辑:

游戏对象:

public class Game {
int gameId;
String gameAnswer;
Boolean finished;
List<Round> Rounds = new ArrayList<>();

我还将包括数据库游戏 table,我将这些字段存储到:

   CREATE TABLE game(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
gameAnswer CHAR(4) NOT NULL,
finished BOOLEAN DEFAULT false
);

为了澄清我的问题,当 运行 postman 中的游戏时,游戏对象及其字段以及游戏答案都会显示。我的目标是 隐藏 这个答案,只要游戏状态显示为“false”。一旦猜中数字,游戏状态将自动设置为真。

这是邮递员 JSON 输出的示例:

{
"gameId": 1,
"gameAnswer": "2651",
"finished": false,
"rounds": [
    {
        "roundId": 1,
        "guess": "1234",
        "timeOfGuess": "2021-06-18 09:28:29",
        "exactMatch": 0,
        "partialMatch": 0,
        "gameId": 1
    }
]

}

当“Finished”设置为 false 时,我希望游戏答案显示为“Hidden”,但仍然有数值可供操作。

猜测方法:

    @Override
public void guess(Round round, Game game) {
    // Takes the games generated answer and the user's guess and breaks them down into character array's
    round.setGameId(game.getGameId());
    char[] gameAnswer = characterBreakDown(game.getGameAnswer());
    char[] roundGuess = characterBreakDown(round.getGuess());

    // used for comparing the array elements one by one
    int min = 0;
    int max = 1;
    int exact = 0;
    boolean run = true;
    while (run) {
        for (int i = 0; i <= 3; i++) {
            if (Arrays.equals(roundGuess, gameAnswer)) {
                round.setExactMatch(4);
                game.setFinished(true);
                gameDao.updateGameById(game);
                run = false;
            } else if (Arrays.equals(roundGuess, min, max, gameAnswer, min, max)) {
                exact++;
                round.setExactMatch(exact);
                min++;
                max++;
                if (i == 3 && round.getExactMatch() >= 2) {
                    round.setPartialMatch(round.getExactMatch());
                    run = false;
                } else if (i == 3) {
                    run = false;
                }
            } else if (!Arrays.equals(roundGuess, min, max, gameAnswer, min, max)) {
                min++;
                max++;
                if (i == 3 && round.getExactMatch() >= 2) {
                    round.setPartialMatch(round.getExactMatch());
                    run = false;
                } else if (i == 3) {
                    run = false;
                }
            }
        }
    }
    game.getRounds().add(round);
    roundDao.createRound(round);
}

如果我理解正确,您的问题是在一个用例中(当您响应 API 请求时),您想要检索游戏并响应 API 请求游戏的“gameAnswer”字段已隐藏,但对于其他纯后台操作,您希望在“gameAnswer”字段完好无损的情况下检索游戏。

假设是这样,我认为你唯一真正的问题是你在哪里“空白”了“gameAnswer”字段。

看起来您目前正在存储库的“gameById”方法中执行此操作。这会导致 gameAnswer 在所有情况下都被隐藏,对吗?

因此,解决方案是在控制器方法中清空 gameAnswer。

如果我有这个错误/倒退,我深表歉意,但是您分段发布代码的方式让人难以理解。但无论如何,我相信解决您的问题的方法是只清空实际需要清空的字段。或者,如果您遇到其他一些问题,因为您是在某些共享方法中这样做的,所以它被消隐/未被消隐,也许可以为需要它的用例创建一个新方法。