2012-06-14 202 views
1

我正在使用Struts并遇到一些奇怪的行为。虽然它不会产生任何错误或错误,但我认为与您分享它会很有趣。Struts2中的奇怪行为

也许你们其中一个可以解释为什么会发生这种情况。

创建下面的代码一个Struts动作 -

public class MyAction extends ActionSupport { 
    private Map<String, Map<String, Object>> map = new HashMap<String, Map<String, Object>>(); 
    public String execute() { 
     System.out.println(map); 
     return SUCCESS; 
    } 

    public Map<String, Map<String, Object>> getMap() { 
     return map; 
    } 

    public void setMap(Map<String, Map<String, Object>> map) { 
     this.map = map; 
    } 
} 

创建关联的映射和需要JSP和执行的操作。 你会看到下面的控制台输出 -

{systemProperties={java.runtime.name=Java(TM) SE Runtime Environment, sun.boot.library.path=C:\Program Files\Java\jdk1.6.0_32\jre\bin, java.vm.version=20.7-b02, shared.loader=${catalina.base}/shared/classes .... 

因此很明显,Struts是注射系统性能到我的地图。 但它为什么这样做呢?我没有要求它这样做。没有使用特殊的XML配置或注释。 什么部分的Struts(什么拦截器)负责这个?我刚刚发现了一个错误还是这种正常行为?如果这是正常的,为什么Struts开发人员认为将每个Map<String, Map<String, Object>>注入系统属性都是明智的做法?

+0

在你的spring配置XML中设置了'autowire'参数吗? – plucury

+0

@plucury为什么会有所作为? Spring注入bean依赖关系。它不注入集合。 –

+0

如果设置了方法,Spring会注入任何类型的属性。 – plucury

回答

0

我刚试过这个,我的猜测是正确的。 您在此输出的代码不会产生任何此类结果。您可以通过查看代码轻松发现此问题。没有什么是填充地图,它只是获取者和制定者。

"So apparently Struts is injecting the system properties into my map"

如果参数传递给这个动作,例如用一种形式,Struts将会寻找在行动了相应的setter法。这会表明在你的代码的某个地方,你的表单或者参数,你有一些叫做"map"的东西传给了这个Action。

首先看看你的struts.xml,看看你是否设置了一些参数。如果没有,那么仔细看看你在哪里调用动作,以及你发送了什么参数。那么你应该能够找到你在地图上传递的位置。

+0

你能分享你的测试应用程序的zip吗?我试过了,它确实为我产生了这样的结果。 –

+0

你尝试过“干净”吗?从代码中创建一个名为MyAction2的新ActionClass。然后创建一个struts.xml映射到'。然后去localhost/testAction来测试它。你可能会得到某种404,但看看你的输出。地图应该是空的。如果它不是空的,那么它意味着你的应用程序中的某些东西正在设置属性“地图”。这可能意味着你的操作是扩展的东西,或者你可能有一些拦截器在做时髦的事情 – user829237