Java Regex Аннотация и требование для тела HTTP POST - PullRequest
1 голос
/ 13 октября 2019

Я только что завершил проект, который возвращает 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;
    }

1 Ответ

1 голос
/ 13 октября 2019

Ваше выражение просто отлично, оно должно работать хорошо, может быть, вы неправильно его реализуете:

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "\\?\\s*$";
        final String string = "This is a question?\n"
             + "This is a question? ";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }
    }
}

Демо


Если выЕсли вы хотите упростить / изменить / изучить выражение, это было объяснено на верхней правой панели regex101.com . Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...