Несоответствие типов в пружинных контроллерах @RequestParam - PullRequest
2 голосов
/ 11 марта 2011

Я работаю над весенним веб-сервисом.Я создал обработчик исключений для обработки любых исключений, чтобы исключение отправлялось клиенту в правильном формате.

Исключение перехватывается на уровне сервиса и отправляется настроенное сообщение.
Проблема в том, что параметры запроса в контроллере имеют числовой тип и если пользователь отправляет строку, тогда сообщение по умолчанию дляисключение отправляется.Но я хочу отправить персонализированную ошибку.Кто-нибудь может подсказать, пожалуйста, как мне это сделать.

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Можно попробовать использовать Перехватчик Spring Handler , извлекая параметр в виде строки из самого запроса, и проверить, является ли он числовым.Вы можете либо иметь по одному перехватчику для каждого случая и наблюдать только на этих конечных точках (более простых, но более классных) или обобщить его для проверки всех параметров конечной точки по запросу.

Один пример для каждого случая:

public class IntTypeCheckInterceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String myIntString = request.getParameter("myInt");
        Pattern intPattern = Pattern.compile("[0-9]+");
        Matcher intMatcher = intPattern.matcher(myIntString);

        //I *think* this does the whole input
        if(!intMatcher.matches()) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST);
            return false; //false tells spring to stop processing and returns to the client
        }

        return true; //true tells spring to continue as normal
    }

}

Config:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    //with this only do where the request parameter is the same name and expected to be an int
    registry.addInterceptor(new IntTypeCheckInterceptor()).paths("/your-intpath", "your-intpath2");
}

Другой подход заключается в проверке метода-обработчика HandlerMethod, извлечении имен и типов параметров и проверке каждого из них.

Фильтр также должен работать,Я просто более знаком с перехватчиками, и это внутри Spring, так что у вас есть все те же функции, доступные в контексте приложения.

0 голосов
/ 11 марта 2011

Я думаю, тебе нужно что-то вроде этого

    @RequestMapping(value = "/happy}", method = RequestMethod.POST)
public String happy(@RequestParam(value = "somevalue") int number) {
    // implement your flow
    return null;
}

@RequestMapping(value = "/happy}", method = RequestMethod.POST)
public String unhappy(@RequestParam(value = "somevalue") String string) {
    // send a custom error message to the user to use a number instead of a String
    return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...