簡體   English   中英

Spring 啟動 WAR 部署在 Tomcat 中啟動失敗

[英]Spring boot WAR deployment failed to start in Tomcat

我試圖將 package 和 spring 啟動應用程序作為一場戰爭。 但是當我嘗試在 tomcat 中部署戰爭並嘗試啟動它時,它會拋出一個異常,說異常啟動過濾器 java.lang.AbstractMethodError。 我的 Spring 啟動版本是 2.2.6 而 Tomcat 版本是 8.5

08-May-2020 09:16:39.995 INFO [http-nio-8080-exec-27] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath
08-May-2020 09:16:48.472 INFO [http-nio-8080-exec-27] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext
08-May-2020 09:17:04.638 SEVERE [http-nio-8080-exec-27] org.apache.catalina.core.StandardContext.filterStart Exception starting filter [APIAuthorizationFilter]
    java.lang.AbstractMethodError
        at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
        at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:110)
        at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4548)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5193)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.manager.ManagerServlet.start(ManagerServlet.java:1383)
        at org.apache.catalina.manager.HTMLManagerServlet.start(HTMLManagerServlet.java:694)
        at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:218)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:211)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:109)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:668)
        at org.apache.catalina.valves.RequestFilterValve.process(RequestFilterValve.java:348)
        at org.apache.catalina.valves.RemoteAddrValve.invoke(RemoteAddrValve.java:52)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1627)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)
08-May-2020 09:17:04.646 INFO [http-nio-8080-exec-27] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext

我的 APIAuthorizationFilter class 是

@Component
public class APIAuthorizationFilter implements Filter{

    @Value("${hmac.secret.key}")
    private String secretKey;

    @Autowired
    private UnauthorizedExceptionController exceptionController;

    @Override
    public void doFilter(ServletRequest sr, ServletResponse sr1, FilterChain fc) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) sr;
        HttpServletResponse httpServletResponse = (HttpServletResponse) sr1;
        try {
            MultiReadHttpServletRequest multiReadRequest = new MultiReadHttpServletRequest(httpServletRequest);

            String authorizationHeader = HmacUtil.getHeaderValue(httpServletRequest, "Authorization");
            String username = HmacUtil.getUsernameFromDecodeBasicAuth(authorizationHeader);
            String password = HmacUtil.getPasswordFromDecodeBasicAuth(authorizationHeader);
            String passwordSecretKey = secretKey;
            if (passwordSecretKey != null && !passwordSecretKey.isEmpty() && passwordSecretKey.length() > 0) {
                if (password.equals(passwordSecretKey.split(",")[0])) {

                    final SignatureBuilder signatureBuilder = new SignatureBuilder()
                            .algorithm(HmacUtil.getAlgorithm())
                            .accessUser(username)
                            .accessPassword(password)
                            .method(httpServletRequest.getMethod())
                            .contentType(MediaType.APPLICATION_JSON)
                            .resource(HmacUtil.getPath(httpServletRequest))
                            .apiSecret(AESEncryption.decryptText(passwordSecretKey.split(",")[1]).getBytes())
                            .body(HmacUtil.getRequestBody(multiReadRequest));

                    String hmac = HmacUtil.getHeaderValue(httpServletRequest, "auth");
                    Logger.getLogger(SignatureBuilder.class.getName()).log(Level.INFO, "Signature " + hmac);
                    if (!signatureBuilder.isHashEquals(hmac.getBytes())) {
                        throw new UnauthorizedException("Cannot access this resource");
                    }
                    fc.doFilter(multiReadRequest, sr1);
                } else {
                    throw new UnauthorizedException("Cannot access this resource");
                }
            } else {
                throw new UnauthorizedException("Cannot access this resource");
            }
        } catch (Exception e) {
            Logger.getLogger(APIAuthorizationFilter.class.getName()).log(Level.SEVERE, "Exception:: " + e.getMessage(), e);
            httpServletResponse.setStatus(HttpStatus.UNAUTHORIZED.value());
            httpServletResponse.setContentType("application/json");
            httpServletResponse.getWriter().write(exceptionController.unauthorizedStringRes(new UnauthorizedException("Cannot access this resource")));
        }
    }

我要注冊的 FilterBean class 是

@Configuration
public class FilterBean {

    @Bean
    public FilterRegistrationBean registerFilter(APIAuthorizationFilter aPIAuthorizationFilter) {
        FilterRegistrationBean<APIAuthorizationFilter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(aPIAuthorizationFilter);
        filterRegistrationBean.addUrlPatterns("/api/*");
        return filterRegistrationBean;
    }

}

I got same error when deploying in tomcat 8.Try deploying in tomcat 9. I think spring boot 2.2 requires tomcat 9.

還默認默認嵌入Z1B359D8753858B55BEFA04441067AAED3Z Z38008D81C2F4D7985ECF4D7985ECF1F1F1F6EF6EF6EB.2.6是ORG.ZB606D606D118D018D012166E6E6E6E6E6E6E6E6E4CCER.ZB.BBER

老問題,但我今天遇到了這個問題,我以與給出的答案不同的方式解決了它。

該錯誤是因為 tomcat 上的 Filter 接口沒有以下默認方法:

 public default void init(FilterConfig filterConfig) throws ServletException {}
 public default void destroy() {}

只需在您的過濾器上實現這兩個,這樣應該可以解決。

@Override
public void init(FilterConfig filterConfig) throws ServletException {
  log.debug("init");
}
@Override
  public void destroy() {
  log.debug("destroy");
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM