Я только что завершил проект, который возвращает String из метода POST. Возвращаемая строка является «ответом», а POST BODY принимает строковый «вопрос». Свойства моего объекта следующие:
@NotNull(message = "Question can't be null.")
@NotEmpty(message = "Question must contain text.")
@Pattern(regexp = "\\?$",
message = "Invalid question. Requires a question mark at the end.")
private String question;
private String answer;
POSTMapping выглядит следующим образом:
@PostMapping(value = "/answer")
@ResponseStatus(HttpStatus.OK)
public String getOneAnswer(@RequestBody @Valid String question) throws Exception {
if(question.equals("")) {
String missingInputErrorMessage = "question input is an empty or does not exist.";
throw new IllegalArgumentException(missingInputErrorMessage);
}
int random = random.nextInt((10) + 1);
for(Answers answer: seriesOfAnswers) {
if(random == answer.getAnswerId()) {
return answer.getAnswer().toString();
}
}
return "Return this string if all else fails";
}
ТЕЛА ПОСТОВ, которые я сделал, выглядит следующим образом:
{
"question": "This is a question"
}
и
{
"question": "This is a question?"
}
В настоящее время регулярное выражение не проверяет, есть ли ?
в конце POST BODY или нет. Это просто запускает ответ независимо. Если я изменю ввод на тип объекта, регулярное выражение проверяет и показывает мне сообщение независимо от того, есть ?
или нет. Мой вопрос заключается в следующем: если можно использовать регулярное выражение в этом формате, как я могу получить регулярное выражение для правильной проверки того, что значение «вопрос» в POST BODY заканчивается ?
?
EDIT: Ниже Эмма упомянула, что моя реализация могла быть неправильной. Она была права. В настоящее время может быть лучший способ справиться с этим, но, следуя ее советам, я решил не использовать аннотацию @Pattern, а вместо этого иметь вызов regex в разделе @PostMapping.
@PostMapping(value = "/answer")
@ResponseStatus(HttpStatus.OK)
public String getOneAnswer(@RequestBody @Valid String question) throws Exception {
// The string with the regex we'll need to use. "q" for question.
String qMarkEndingRegex = "\\?$";
// The pattern we're going to check.
Pattern checkForQMark = Pattern.compile(qMarkEndingregex, Pattern.MULTILINE);
// The matcher to actually check the question
Matcher qMarkMatcher = checkForQMark.matcher(question);
// if the matcher does NOT detect a question mark as the regex states, run this code.
if (!qMarkMatcher.find()) {
String needsQ = "You need to add a question mark at the end of your question.";
return needsQ;
}