Прежде всего, моя грамматика ужасна, потому что я плохо разбираюсь в английском.
Я попытался проверить контроллер, но произошла ошибка.
NoSuchBeanDefinitionException: No qualifying bean of type 'com.ccstudy.qna.interceptor.LoginSessionCheckInterceptor' available: expected at least 1 bean which qualifies as autowire candidate.
Я сделал перехватчик и цель перехватчика - сравнить переменную пути с идентификатором сессии.
Я сделал 1 интерфейс и 2класс
public interface LoginSessionCheckInterceptor extends HandlerInterceptor {
}
@Profile("prod")
@Component
@Slf4j
public class LoginSessionCheckInterceptorImpl implements LoginSessionCheckInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
AccountSessionDto accountSessionDto = (AccountSessionDto) request.getSession()
.getAttribute(AccountSessionDto.ATTRIBUTE_NAME);
Long pathId = getPathId(request);
validateId(accountSessionDto, pathId);
return true;
}
private Long getPathId(HttpServletRequest request) {
Map<?, ?> pathVariables = (Map<?, ?>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
return Long.parseLong((String) pathVariables.get("id"));
}
private void validateId(AccountSessionDto sessionDto, Long pathId) {
if (!sessionDto.getId().equals(pathId)) {
throw new SessionMismatchException();
}
}
}
@Profile("dev")
@Component
@Slf4j
public class LoginSessionCheckTestInterceptor implements LoginSessionCheckInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
}
и это мой WebMvcConfigurer.class
@Configuration
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {
private final AccountHandlerMethodArgumentResolver accountHandlerMethodArgumentResolver;
private final LoginSessionCheckInterceptor loginSessionCheckInterceptor;
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
registry.addViewController("/question/form").setViewName("/pages/form");
registry.addViewController("/register").setViewName("/pages/register");
registry.addViewController("/login").setViewName("/pages/login");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginSessionCheckInterceptor)
.addPathPatterns("/users/{id}")
.addPathPatterns("/questions/edit/**")
.addPathPatterns("/questions/delete/**")
.excludePathPatterns("/users/login");
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(accountHandlerMethodArgumentResolver);
}
}
, и это мой AccountControllerTest
@WebMvcTest(AccountController.class)
@RunWith(SpringRunner.class)
@ActiveProfiles("dev")
public class AccountControllerTest {
@Autowired
private MockMvc mvc;
...
}
я просто хочузапустить тестовый код с Компонентом для теста.в этом случае LoginSessionCheckTestInterceptor