升级到Struts 2.5.17版时出现的问题

时间:2018-10-25 18:55:01

标签: struts2 tiles tiles-3 xwork struts2-tiles-plugin

我正在尝试将struts版本从2.3.35升级到2.5.17,但是遇到如下问题:

java.lang.NullPointerException
    at com.opensymphony.xwork2.util.fs.StrutsJarURLConnection.getInputStream(StrutsJarURLConnection.java:170)
    at com.opensymphony.xwork2.util.fs.JarEntryRevision.needsReloading(JarEntryRevision.java:84)
    at com.opensymphony.xwork2.util.fs.DefaultFileManager.fileNeedsReloading(DefaultFileManager.java:65)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.needsReload(XmlConfigurationProvider.java:428)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.needsReload(StrutsXmlConfigurationProvider.java:163)

我一直在使用本指南来迁移到struts版本2.5.17: https://cwiki.apache.org/confluence/display/WW/Struts+2.3+to+2.5+migration

我怀疑这是瓷砖问题。

我已将所有与struts相关的jar升级到2.5.17版,包括struts2-tiles-plugin。我还将所有与瓷砖相关的罐子都升级到了3.0.7。

我还删除了Xwork-core jar,因为它已从2.5 xwork合并到struts2-core jar。

我做错什么了吗

请注意:到目前为止,我尚未进行任何代码更改。该代码与struts 2.3.35版完美配合。但是,一旦我升级了struts版本和tile版本,我就开始遇到这个问题。

有人可以建议我做错什么吗?

2 个答案:

答案 0 :(得分:0)

  

,应该在不更改代码的情况下出现错误。

我不认为您做错了什么。

在添加新的.jar并删除旧的.jar之后,它仅在代码与新框架兼容时才起作用。


代码更改为:

.xml

  1. 将以下<code>添加到web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class> org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
  1. struts-config.xml 更改为 struts.xml 并进行以下更改:
      

    您可以完全删除struts-config.xml并使用注释而不是.xml文件。(自struts 2.5.17开始)

<?xml version="1.0" encoding="ISO-8859-1" ?>        <!-- change to UTF-8 -->
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd "> <!-- change to struts-2.5.dtd -->
<struts-config>                     <!-- change to <struts>  -->
<!-- add <include file="struts-default.xml"/> -->
<form-beans>
<form-bean name="MyClassForm" type="forms.MyClassForm">
</form-bean>
</form-beans>

<action-mappings>       <!-- change to <package name="hello-default" extends="struts-default"> -->
<action path="/MyClass" name="MyClassForm" type="actions.MyClassAction"
validate="false">
<action name = “MyClass” class = “actions.MyClass”>
<forward name="success" path="/Index.jsp"/>
<result> /Index.jsp </result>
</action>
</action>
</action-mappings>          <!-- change to  </package> -->
<message-resources parameter="resources"/>
</struts-config>                <!-- change to  </struts> -->

.java

  1. 删除ActionForm.java文件。

      

    属性包含在我们的Action类应该扩展的ActionSupport类中。

  2. 更改Action.java

import javax.servlet.http.*;
import org.apache.struts.action.*;

public class MyClassAction extends Action // change to ActionSupport {  
//fields are now a property of the ActionSupport class  

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {

// change to public String execute() throws Exception {

MyClassForm input = (MyClassForm) form; // don't need this
input.setField1(“Hello”);    // change to setMessage(“Hello”);
return mapping.findForward(“success”);    // change to return Action.SUCCESS;

.jsp

  1. 此JSP中要执行的操作是:

    • 替换<%@ taglib %>指令
    • 使用struts-tags.tld定义的一组新标签
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <html>
    <head>
    <title>Hello!</title>
    </head>
    <s:form action="submit.action" method="post">
    <body>
    <s:textfield label="Name" name=" field1" />
    <s:property value="field1"/>
    <s:submit" />
    </body>
    </s:form>
    </html>

干杯。

答案 1 :(得分:0)

我通过将struts版本升级到2.5.18解决了这个问题。当我将struts版本降级到2.5.13时,它也可以正常工作。

但是不建议在2.5.16和2.3.36(含)之间使用struts版本,因此我已将其升级到2.5.18