Call Controller метод из Java - PullRequest
0 голосов
/ 21 мая 2019

Я хотел бы вызвать метод Controller через класс Java, чтобы я мог вернуть конкретное представление. В этом случае у меня есть короткий список идентификаторов; если идентификатор текущего пользователя отсутствует в этом списке, перенаправьте его в представление invalidUser.

Я могу сделать это на стороне клиента с помощью Ajax или кнопки: onclick="location.href='/invalidUser'

Но мне не ясно, как я могу вызвать метод invalidUser () от ViewsController из класса Java.

Как я могу сделать это с Java в методе invalidUserRedirect ()? Я думал получить базовый URL-адрес из HttpServletRequest, как показано здесь: Получить корневой / базовый URL в Spring MVC , а затем сделать http-вызов baseUrl + "/ invalidUser", но это не похоже на право подход.

AuthService:

@Service
public class AuthService {

  public void invalidUserRedirect(HttpServletRequest request) {
    // Make call to invalidUser() in ViewsController
  }
}

Контроллер просмотров:

@Controller
public class ViewsController {
  @RequestMapping(value = "/invalidUser", method = {RequestMethod.GET})
  public String invalidUser() {
    return "invalid";
  }

}

Ответы [ 3 ]

2 голосов
/ 21 мая 2019

Классы контроллеров вызываются из вашего браузера.Вы не должны вызывать метод Controller из вашего класса обслуживания.Ваш метод контроллера должен вызвать invoke ваш класс обслуживания

1 голос
/ 22 мая 2019

Класс контроллера, обычно используемый для перенаправления потока приложения на основе вашей бизнес-логики. Больше всего методов в контроллере помечены аннотацией @RequestMapping, даже если вы можете вызывать метод контроллера из службы, он не сможет выполнить эту задачу, поскольку возвращаемый тип Controller приводит к конкретному представлению. Вы должны написать реализацию AuthenticationFailureHandler для достижения функциональности. Это легко достижимо благодаря пружинной безопасности

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.stereotype.Component;

@Component
public class MyAuthenticationFailureHandler  implements AuthenticationFailureHandler{

@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
    AuthenticationException exception) throws IOException, ServletException {
    request.setAttribute("param", "invaliduser");
    response.sendRedirect("/domain/?error");
} }

Назовите этот класс в классе безопасности

@Autowired
 MyAuthenticationFailureHandler failureHandler;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
  http.formLogin()
                .loginPage(LOGIN_URL)
                .failureUrl(LOGIN_URL + "?error").permitAll()
                .authenticationDetailsSource(authDetailsSource)
                .successHandler(successHandler)
                .failureHandler(failureHandler);
      }
0 голосов
/ 24 мая 2019

Контроллер должен определить, какие службы вызывать, основываясь на пользовательских запросах.
Служба не определяет контроллер.
Я думаю, что это не очень хорошая практика.
Ваш контроллер должен быть таким:

@Controller
public class ViewsController {

    @Autowired
    private UserValidator userValidator;

    @RequestMapping(value = "/testUser", method = { RequestMethod.GET })
    public String testUser(UserInfo userInfo) {
        //call service
        boolean isValidUser = userValidator.test(userInfo);
        if(isValidUser)
            return "validUserPage";
        else
            return "invalid";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...