2016-10-25 10 views
2

У меня есть приложение Spring-Boot, которое упаковано в виде войны с зависимостью tomcat (как я имею обе опции), используя упакованный .war для запуска внутри встроенного контейнера после запуска он через java -jar команду И также для запуска в автономном контейнере сервлета).Interceptor не получает инициализацию и вызывается с помощью SpringBoot

Ниже мое приложение основной класс

package com.mycompany.edsa.dgv.proxysvc; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.web.support.SpringBootServletInitializer; 
import org.springframework.context.annotation.Bean; 
//import org.springframework.context.annotation.Import; 
import org.springframework.context.annotation.ImportResource; 
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 

import com.mycompany.edsa.dgv.proxysvc.interceptor.DGVProxySvcRequestInterceptor; 

//import com.mycompany.edsa.dgv.proxysvc.config.ConfigExtension; 

@SpringBootApplication 
@ImportResource("classpath:dgv-proxy-svc-spring-ctx.xml") 
//@Import(ConfigExtension.class) 
public class DGVProxySvcAppMain extends SpringBootServletInitializer { 

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

@Override 
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
    return application.sources(DGVProxySvcAppMain.class); 
} 

@Bean 
public DGVProxySvcRequestInterceptor dgvProxySvcRequestInterceptor() { 
    DGVProxySvcRequestInterceptor dgvProxySvcReqInterceptor = new DGVProxySvcRequestInterceptor(); 
    return dgvProxySvcReqInterceptor; 
} 


@Bean 
public WebMvcConfigurerAdapter adapter() { 
    return new WebMvcConfigurerAdapter() { 
     @Override 
     public void addInterceptors(InterceptorRegistry registry) { 
      System.out.println("Adding interceptors"); 
      registry.addInterceptor(dgvProxySvcRequestInterceptor()).addPathPatterns("/*"); 
      super.addInterceptors(registry); 
     } 
    }; 
} 

}

Мой Перехватчик класс ниже:

package com.mycompany.edsa.dgv.proxysvc.interceptor; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.stereotype.Component; 
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 

@Component 
public class DGVProxySvcRequestInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 

     /* Put in the code here to validate user principal before passing control to the controller */ 

     //BXPPrincipal principal = (BXPPrincipal)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     //Map<String, ?> result = principal.getAttributes(); 
     System.out.println("Inside DGVProxySvcRequestInterceptor..."); 
     return super.preHandle(request, response, handler); 
    } 

} 

Однако на запуск приложения (я запускаю через spring-boot:run Maven цели и с помощью Eclipse, IDE), я не вижу, чтобы мой перехватчик регистрировался в журналах консоли. Я попытался запустить его в режиме отладки с точкой останова в методе public void addInterceptors(InterceptorRegistry registry), и я вижу, что элемент управления приходит в этот момент, и сообщение sysout "Adding interceptors" регистрируется на консоли, а также registry содержит мой DGVProxySvcRequestInterceptor в его инкапсулированном массиве ArrayList, но не уверен, почему никакое сообщение на консоли не упоминает об инициализации этого компонента-перехватчика. Кроме того, при вызове моей службы я не вижу сообщение sysout "Inside DGVProxySvcRequestInterceptor...", которое было помещено в мой класс перехватчика 'preHandle (что подтверждает, что перехватчик не вызывался).

Может ли кто-нибудь помочь мне найти, какую ошибку конфигурации я мог бы делать?

примечание Pls. Я попытался расширить свой основной класс с помощью WebMvcConfigurerAdapter вместо SpringBootServletInitializer и переопределить метод addInterceptors, чтобы добавить мой перехватчик. В этом случае мой перехватчик хорошо инициализируется (я вижу в консольных журналах), а также вызывается при вызове моего служебного uri. Так что это говорит мне, что что-то не так с моей конфигурацией, когда я пытаюсь использовать SpringBootServletInitializer (я должен использовать этот инициализатор, поскольку мне нужно упаковать свой код в качестве войны, которая может работать в автономном контейнере сервлетов).

Заранее благодарим за любые предложения/указатели!

ответ

0

Обнаружено исправление. Пришелся использовать ant как шаблон URL, чтобы соответствовать запросам:

registry.addInterceptor(dgvProxySvcRequestInterceptor()).addPathPatterns("/**"); 

Моей первоначальная конфигурация все была хорошо; не требовало каких-либо изменений, кроме вышеуказанного шаблона URL.

0
@Configuration 
@EnableWebMvc 
public class AppConfig extends WebMvcConfigurerAdapter { 
    // @Bean resolvers , etc 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 

     registry.addInterceptor(new DGVProxySvcRequestInterceptor()).addPathPatterns("/controller/action/*"); 
    } 
} 
+0

Я считаю, что использование @EnableWebMvc позволит избежать использования конфигураций Spring, которые я предполагаю. Нет ли обходного пути для добавления перехватчика без переопределения автоконфигурации? – lbvirgo

+0

Кроме того, попробовал вышеуказанное предложение; не помогает. Сначала запускается контроллер, а затем перехватчик! – lbvirgo

+0

Вы правильно заменили свои URL-адреса «addPathPatterns», – kuhajeyan

0

У меня был такой же выпуск. @SpringBootApplication сканирует весь компонент только из текущего пакета. Чтобы сканировать другой пакет, нам нужно указать пакет в @ComponentScan. Для примера

package com.main; 
@SpringBootApplication 
public class Application { 
    //Code goes here. 
} 

Теперь я хочу перехватчик быть регистр, который не является ни в com.main не com.main.**, ее наличии в com.test пакете.

package com.test.interceptor 
@Configuration 
public class InterceptorConfig extends WebMvcConfigurerAdapter { 
    @Autowired 
    HeaderInterceptor headerInterceptor; 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(headerInterceptor); 
    } 
} 

В вышеприведенном случае Spring Загрузочный не зарегистрирует HeaderInterceptor в контексте. Чтобы зарегистрироваться, мы должны явно сканировать этот пакет.

package com.main; 
@SpringBootApplication 
@ComponentScan("com.*") //Which takes care all the package which starts with com. 
@ComponentScan({"com.main.*","com.test.*"}) //For specific packages 
public class Application { 
    //Code goes here. 
}