wildfly 8.1.0.final + shiro+springboot 项目部署

798 阅读1分钟

错误

java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectWriter.forType

解决方法:

在./src/main/webapp/WEB-INF目录下创建jboss-deployment-structure.xml文件,并添加下面内容:

<?xml version='1.0' encoding='UTF-8'?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.1">
    <deployment>
        <exclusions>
            <!-- 排除slf4j -->
            <module name="org.slf4j" />
        
            <!-- 排除jackson -->
            <module name="com.fasterxml.jackson.core.jackson-core" />
            <module name="com.fasterxml.jackson.core.jackson-annotations" />
            <module name="com.fasterxml.jackson.core.jackson-databind" />
            <module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8" />
            <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310" />
            <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

at java.util.ArrayList.(ArrayList.java:178)

错误信息

11:20:35,961 ERROR [org.springframework.boot.web.support.ErrorPageFilter] (default task-21) Forwarding to error page from request [/xxx] due to exception [null]: java.lang.NullPointerException
    at java.util.ArrayList.<init>(ArrayList.java:178) [rt.jar:1.8.0_162]
    at io.undertow.servlet.spec.HttpServletResponseImpl.getHeaders(HttpServletResponseImpl.java:248) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at javax.servlet.http.HttpServletResponseWrapper.getHeaders(HttpServletResponseWrapper.java:303) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
    at javax.servlet.http.HttpServletResponseWrapper.getHeaders(HttpServletResponseWrapper.java:303) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
    at javax.servlet.http.HttpServletResponseWrapper.getHeaders(HttpServletResponseWrapper.java:303) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
    at javax.servlet.http.HttpServletResponseWrapper.getHeaders(HttpServletResponseWrapper.java:303) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
    at org.springframework.http.server.ServletServerHttpResponse$ServletResponseHttpHeaders.get(ServletServerHttpResponse.java:161) [spring-web-4.3.10.RELEASE.jar:4.3.10.RELEASE]

解决方法

  • 升级8.2版本wildfly

  • 重新编译 undertow-servlet-1.0.15.Final.jar 并替换 8.1版本wildfly中原来的jar包

可以在 github.com/Nomiracle/u… 获取编译好的jar包然后跳到下面的步骤6直接替换并运行。

重新编译步骤:

  1. codeload.github.com/undertow-io… 下载源码包

  2. 打开 .\undertow-1.0.15.Final\servlet\src\main\java\io\undertow\servlet\spec\HttpServletResponseImpl.java 文件

  3. 替换下面代码:

    @Override
     public Collection<String> getHeaders(final String name) {
     return new ArrayList<String>(exchange.getResponseHeaders().get(name));
     }
    

    替换为:

    @Override
     public Collection<String> getHeaders(final String name) {
     final HeaderValues headerValues = exchange.getResponseHeaders().get(name);
     if (headerValues != null) {
     return new ArrayList<String>(headerValues);
     }
     return new ArrayList<String>();
     }
    
  4. 在 HttpServletResponseImpl.java文件中添加 HeaderValues 的引用:

    import io.undertow.util.HeaderValues;
    
  5. 在 .\undertow-1.0.15.Final\servlet 文件夹下运行 mvn package 打包

  6. 替换 <WildFly_Home>/modules/system/layers/base/io/undertow/servlet/main/undertow-servlet-1.0.15.Final.jar

  7. 重新运行

与shiro适配问题

在 shiro配置类中找到以下代码片段

    @Bean
    public SessionManager sessionManager() {
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        Collection<SessionListener> listeners = new ArrayList<SessionListener>();
        listeners.add(new BDSessionListener());
        sessionManager.setSessionListeners(listeners);
        sessionManager.setSessionDAO(sessionDAO());
        return sessionManager;
    }

增加自定义Cookie

    @Bean
    public SessionManager sessionManager() {
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        //----------add custom Cookie-----------------------------------
        sessionManager.setSessionIdCookieEnabled(true);
        Cookie cookie = new org.apache.shiro.web.servlet.SimpleCookie();
        cookie.setName("CUSTOM_YOUR_OWN_COOKIE_NAME");
        sessionManager.setSessionIdCookie(cookie);
        //--------------------------------------------------------------
        Collection<SessionListener> listeners = new ArrayList<SessionListener>();
        listeners.add(new BDSessionListener());
        sessionManager.setSessionListeners(listeners);
        sessionManager.setSessionDAO(sessionDAO());
        return sessionManager;
    }

reference

【1】stackoverflow.com/questions/2…

【2】blog.csdn.net/A1318066232…

【3】conorprunty.medium.com/issues-with…