如何在保留对象字段的原始值的同时更改对象字段的呈现方式



我正在进行一个项目,该项目涉及使用JDBC模板创建一个Spring Boot REST应用程序,以访问我自己创建的数据库(MySQL(。我使用Postman来验证端点,并通过Postman使用JSON输入数据。我目前的任务是创建一个猜谜游戏,生成一个随机的4位数,很容易。我的问题是"返回基于ID的特定游戏。确保进行中的游戏不会显示其答案";我创建了一个";启动器";方法,但仅限于最基本的级别。一旦对象的字段值变为"0",我就无法对其进行操作;隐藏的"因为它不再是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
);

为了澄清我的问题,当在poster中运行游戏时,游戏对象及其字段都会显示出来,游戏答案也会显示出来。我的目标是隐藏这个答案,只要游戏状态为";false";。一旦正确猜测了数字,游戏状态将自动设置为true。

以下是poster的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,则我希望游戏答案为"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);
}

如果我理解正确的话,您的问题是在一个用例中(当您响应API请求时(,您想要检索一个Game并使用Game的"来响应API请求;gameAnswer";字段隐藏,但对于其他纯粹的后台操作,您希望用";gameAnswer";字段完好无损。

假设是这样的话,我认为你唯一真正的问题是你";"空白";";gameAnswer";领域

看起来你目前正在";gameById";方法。这会导致gameAnswer在任何情况下都被隐藏,对吧?

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

如果我错了/倒退了,我很抱歉,但你发布代码的方式,支离破碎,让人很难理解。但无论如何,我相信你的问题的解决方案是只在实际需要空白的地方空白。或者,如果你有其他问题,因为你在某个共享方法中这样做,所以它被清空/不被清空,也许可以为另一种方式需要它的用例创建一个新方法。

最新更新