Проблема с контроллерами в Spring-MVC

254
04 апреля 2018, 11:16

Здравствуйте, в последних нескольких коммитаъ возникла странная ошибка, так и не получилоьс отследить откуда у нее корни растут, хотя до этого все работало прекрасно, вот пример кода:

Controller

@Controller
@RequestMapping("/auethentification")
public class AuethentificationController {
    @Autowired
    private Auethentification auethentification;
    @Autowired
    private Olympiad olympiad;
    // ...
    @RequestMapping(value = "/logIn", method = RequestMethod.POST, produces = "text/plain;charset=UTF-8")
    public @ResponseBody String logIn(@RequestParam(value = "login_sign_in") String login,
                                  @RequestParam(value = "pass_sign_in") String password) {
        RoleUser roleUser = auethentification.authenticate(login, password);
        switch (roleUser) {
            case ADMIN:
                return "admin_room";
            case USER:
                olympiad.startOlympiad(login, password);
                return "tasks";
            case UNKNOWN:
                return "Не правильные данные";
        }
        return "Не правильные данные";
    }
    // ...
}

JSP

<form method="POST" action="<c:url value="/auethentification/logIn"/>" class="sign-in-htm">
    <div class="group">
        <label class="label">Логин</label>
        <input name="login_sign_in" type="text" class="input">
    </div>
    <div class="group">
        <label class="label">Пароль</label>
        <input name="pass_sign_in" type="password" class="input" data-type="password">
    </div>
        <div class="group">
        <button name="btn_sign_in" class="button btn">Войти</button>
    </div>
    <p class="log_in animated" data-effect="tada"></p>
</form><!-- end sign-in-html -->

JS

formSignIn.submit(function(){
    disableButton(btnSignIn);
    var login = $("input[name='login_sign_in']");
    var password = $("input[name='pass_sign_in']");
    if(login.val() === ""){
        loggerSignIn.html("Не введен логин.");
        animate(loggerSignIn);
        enableButton(btnSignIn);
        return false;
    }
    if(password.val() === ""){
        loggerSignIn.html("Не введен пароль.");
        animate(loggerSignIn);
        enableButton(btnSignIn);
        return false;
    }
    authenticate(formSignIn, btnSignIn);
});
function authenticate(form, btn){
    disableButton(btn);
    $.post(form.attr("action"), form.serialize(), function(response){
        switch (response){
            case "tasks" :
                $(location).attr("href", "/tasks/showPage");
                break;
            case "admin_room" :
                $(location).attr("href", "/adminRoom/showPage");
                break;
            default :
                // ...
        }
    });
    event.preventDefault();
}

Configuration

@EnableWebMvc
@Configuration
@ComponentScan("ru.testingsystem.controllers")
public class MVCConfig extends WebMvcConfigurerAdapter {
    @Bean
    public InternalResourceViewResolver setupViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/views/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(JstlView.class);
        return resolver;
    }
    // ...
}

Ошибка

[http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod  - Failed to resolve argument 0 of type 'java.lang.String'
org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'login_sign_in' is not present
// ...
[http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver  - Resolving exception from handler [public java.lang.String ru.testingsystem.controllers.AuethentificationController.logIn(java.lang.String,java.lang.String)]: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'login_sign_in' is not present
[http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver  - Resolving exception from handler [public java.lang.String ru.testingsystem.controllers.AuethentificationController.logIn(java.lang.String,java.lang.String)]: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'login_sign_in' is not present
[http-nio-8080-exec-4] DEBUG org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver  - Resolving exception from handler [public java.lang.String ru.testingsystem.controllers.AuethentificationController.logIn(java.lang.String,java.lang.String)]: org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'login_sign_in' is not present

И вот дело в том что на всех контроллерах такая ерунда, хотя просто на выдачу страницы все отлично работает, но как тольок окнтроллер принимает данные, то... Надеюсь что кто-нибудь подскажет в чем дело, то уже просто не знаю что делать.

Answer 1

Ваша проблема в аннотировании параметров аннотацией @RequestParam. Параметры, помеченные данные аннотацией будут искаться в параметрах запроса. Т.е. если запрос будет вида POST /auethentification/logIn?login_sign_in="login"&pass_sign_in="password", то у Вас скорее всего все сработает. В случае POST запроса данные формы будут в теле запроса, поэтому Вам можно объединить Ваши параметры в класс, например LoginForm и принимать в методе этот класс

@RequestMapping(value = "/logIn", method = RequestMethod.POST, produces = "text/plain;charset=UTF-8")
public @ResponseBody String logIn(@RequestBody LoginForm form) {
    RoleUser roleUser = auethentification.authenticate(form.login, form.password);
    switch (roleUser) {
        case ADMIN:
            return "admin_room";
        case USER:
            olympiad.startOlympiad(form.login, form.password);
            return "tasks";
        case UNKNOWN:
            return "Не правильные данные";
    }
    return "Не правильные данные";
}
READ ALSO
File Chooser Dialog со специфичным расширением (.svg)

File Chooser Dialog со специфичным расширением (.svg)

Необходимо сделать так, чтобы File Chooser Dialog делал доступными для выбора не все файлы, а только те, которые имеют расширениеsvg Мой код:

218
Эффективная сортировка ArrayList

Эффективная сортировка ArrayList

Нужно написать реализацию функции void merge(ArrayList a, ArrayList b) { // тело функции }

384
Fragment and SimpleCursorAdapter

Fragment and SimpleCursorAdapter

Подскажите как правильно реализоватьЕсть Фрагмент ListView, который программно вызываю взависимости от клика

177
Открытие меню выбора файлов при нажатии на кнопку

Открытие меню выбора файлов при нажатии на кнопку

Нужно, чтобы по нажатию на кнопку открывалось меню выбора файла из внутренней памяти или флешкиКак это реализовать?

220