SpringBoot: Controllers & Filter инициализируется, но не вызывается

java servlets spring-boot

1036 просмотра

3 ответа

2105 Репутация автора

Я запускаю очень простое spring-bootприложение:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

У меня есть простой фильтр:

@Component
public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException     {
       // This is getting called ! 
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // some logic
        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
}

У меня есть один контроллер, который возвращает страницу индекса:

@Controller
public class HomeController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }

}

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

В моих журналах я вижу:

2016-07-18 11:59:51.840  INFO 15623 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'MyFilter' to: [/*]

Что мне не хватает?

Изменить: После комментариев здесь я увидел, что мой контроллер также не вызывается. Так что это не проблема с фильтром, а симптом более серьезной проблемы.

Это мой проект конструктор:

.
├── Dockerfile
├── build.gradle
├── gradlew
├── settings.gradle
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── mypackage
│   │   │           ├── Application.java
│   │   │           ├── GreetingController.java
│   │   │           ├── HomeController.java
│   │   │           └── MyFilter.java
│   │   └── resources
│   │       ├── application.yml
│   │       └── templates
│   │           ├── greeting.html
│   │           └── index.html

Я создаю файл JAR с gradle:

./gradlew clean build

И работает это:

java -jar build/libs/sample-webapp-1.0.0.jar

Я звоню http://localhost:8080и получаю index.htmlфайл (возможно, не через контроллер).

Весенняя версия есть 1.3.6-RELEASE.

Часть моего build.gradle:

buildscript {
    repositories {
        maven {
            url "http://jcenter.bintray.com"
        }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.6.RELEASE")
    }
}

dependencies {
        compile("org.springframework.boot:spring-boot-starter-thymeleaf")
        compile("org.springframework.boot:spring-boot-devtools")
        compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.6.2'
        compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.6.2'
        compile group: 'org.bouncycastle', name: 'bcprov-jdk16', version: '1.46'
        testCompile("junit:junit")
}
Автор: Shikloshi Источник Размещён: 18.07.2016 09:07

Ответы (3)


0 плюса

1462 Репутация автора

Ваша карта фильтра, /*поэтому ваш вызов индекса должен быть http: // localhost: 8080 / index .
Как вы называете индекс?

Автор: Issam EL-ATIF Размещён: 18.07.2016 09:34

0 плюса

29 Репутация автора

Я полагаю, что DefaultServlet Tomcat принимает его, вы можете попробовать добавить точку останова на org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory#addDefaultServlet, а затем добавить точку останова на org.apache.catalina.servlets.DefaultServlet#doGet.

Автор: bohr.qiu Размещён: 19.07.2016 03:17

0 плюса

1 Репутация автора

Все классы (включая контроллеры и фильтры) должны быть в пакетах, которые находятся на один уровень ниже пакета, содержащего ваш файл Application.class.

Автор: Ameya Kabre Размещён: 28.04.2017 07:55
Вопросы из категории :
32x32