错误
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直接替换并运行。
重新编译步骤:
-
打开 .\undertow-1.0.15.Final\servlet\src\main\java\io\undertow\servlet\spec\HttpServletResponseImpl.java 文件
-
替换下面代码:
@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>(); }
-
在 HttpServletResponseImpl.java文件中添加 HeaderValues 的引用:
import io.undertow.util.HeaderValues;
-
在 .\undertow-1.0.15.Final\servlet 文件夹下运行 mvn package 打包
-
替换 <WildFly_Home>/modules/system/layers/base/io/undertow/servlet/main/undertow-servlet-1.0.15.Final.jar
-
重新运行
与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;
}