【问题标题】:How can I change how an objects field is PRESENTED while still retaining the original value of said field?如何更改对象字段的呈现方式,同时仍保留所述字段的原始值?
【发布时间】:2021-09-03 15:30:30
【问题描述】:

我正在开展一个项目,该项目涉及使用 JDBC 模板创建 Spring Boot REST 应用程序以访问我自己创建的数据库 (MySQL)。我正在使用 Postman 验证端点并通过 postman 使用 JSON 输入数据。我目前的任务是创建一个猜谜游戏,它会生成一个随机的 4 位数字,这很容易。我的问题是这个; “根据 ID 返回一个特定的游戏。确保正在进行的游戏不显示他们的答案” 我创建了一个满足要求的“启动器”方法,但仅限于最基本的级别。一旦对象的字段值更改为“隐藏”,我就无法对对象进行操作,因为它不再是 4 位数字。我想隐藏答案,同时仍然能够以功能方式对随机生成的数字进行操作。这是我返回的基本方法:

  @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<>();

我还将包括我将所述字段存储到的数据库游戏表:

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

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

以下是 postman 的 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
    }
]

}

虽然“已完成”设置为 false,但我希望游戏答案显示为“隐藏”,但仍有数值存在以进行操作。

猜测方法:

    @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);
}

【问题讨论】:

  • 您能给我们看一下 Game 对象的 sn-p 吗?
  • 让我澄清一下,您有一个使用 JDBC 和 MySQL 存储的 4 位数猜谜游戏。查看您拥有game.getFinished() 的事实,这意味着您可以运行多个“游戏会话”本身。您的目标是使用其数据库 ID 或任何内在链接的游戏检索任何游戏,但是当游戏未完成时,您希望玩家继续吗? (另一种说法don't display answer
  • 我建议重新表述您的问题并添加一些支持代码 sn-ps 和示例。我理解这个想法,但对我来说似乎有点不清楚你想要实现什么。例如。展示一些你想要什么功能的例子,无论是视觉的还是基于代码的,它可以帮助其他人更多地了解你的问题。
  • 感谢您的回复,亚历克斯。我仍在研究“提出好的问题”部分。我的目标是隐藏游戏对象的“答案”字段的输出,只要将完成的布尔值设置为 false。 @Alex我已经添加了更多说明,如果不是不便,请告诉我是否还有其他需要澄清的地方。再次感谢你!也回答你的第二个问题;一旦游戏完成,唯一改变的是完成的布尔值设置为 true,如果从数据库中检索游戏,则答案存在而不是隐藏。
  • 我不明白你的说法,“我想隐藏答案,同时仍然能够以功能方式对随机生成的数字进行操作”。如果您想对您的 api 客户端隐藏答案,那么您已经在做正确的事情(尽管我可能会将“gameAnswer”设置为 null 或空字符串)。 “仍然能够以功能方式对随机生成的数字进行操作”是什么意思?您不会在数据库中更改它,是吗?

标签: java json spring-boot spring-mvc jdbctemplate


【解决方案1】:

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

假设是这种情况,我认为您唯一真正的问题是您“清除”“gameAnswer”字段的位置。

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

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

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

【讨论】:

  • 非常感谢@GreyBeardedGeek 的帮助以及其他所有评论的人,尽管问题和谜题的格式像代码的sn-ps,哈哈。当你提到在控制器方法中删除答案的那一刻,我意识到我会将我的 Get 方法更改为通用检索方法而不修改内容,然后通过我的控制器方法运行对象并在最后设置条件,它工作正是我想要的!将来我会记住发布问题的建议再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多