我以前从未使用过Struts,所以我不确定我想做什么是可能的。
我有一个Action类,它有一个MyType属性:
public class Action /* extends ... */ {
private MyType myType;
// getters and setters and other members omitted
public String doStuff() {
myType.foo(); // NPE
// ...
}
}我重构了代码(以实现装饰器模式,幸亏不知道Struts及其内部工作),并使MyType成为一个interface,MyTypeImpl提供了它的实现。
现在,当操作被调用时,myType是null,而在过去,它保存了MyType (现在的MyTypeImpl)的一个实例。
所以,我的问题基本上是:我能否让Struts很好地处理这个设置,即让它在MyTypeImpl类中使用MyType的属性,而不必更改实际的网页?(换句话说,如何在将所需更改的数量保持在最低限度的同时,使其工作?)
看看我们在类路径上是如何使用struts2-spring-plugin的,我认为Spring最终会注入myType的值,这让我希望它可以被配置?更新3:在深入研究这个问题之后,我不认为它与Spring有任何关系。Struts通过用户输入的值自动创建属性。这些属性似乎没有通过Spring连接起来。(如果是的话,它们就是prototype的,但我不知道如何填充它们的字段。)prototype是而不是,是一个服务bean!
更新:这里的是Spring配置的摘录--它似乎不相关,因为它没有提到MyType
<bean id=“Action” class=“com.example.Action" scope="prototype">
<property name=“fooService” ref=“fooService”/>
<property name=“barService” ref=“barService”/>
</bean>Struts配置文件中的相关代码片段:
<constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory" />
<constant name="struts.objectFactory.spring.autoWire" value="name" />
<!-- ... -->
<action name=“doStuff” class="Action" method=“doStuff”>
<!-- several interceptors called, among them -->
<interceptor-ref name="store"><!-- ... --><interceptor-ref/>
<interceptor-ref name="paramsPrepareParamsStack">
<!-- according to http://struts.apache.org/docs/interceptors.html this calls
ParametersInterceptor which is probably involved in the instantiation of it all… -->
<!— several results defined —>
</action>有Struts经验的人能告诉我,如果我想要做的事情(让Struts在注入对象时使用实现而不是接口),通常可以使用(例如通过在MyType myType上使用注释)吗?如果唯一的解决办法是改变Spring的自动装配类型,那么可以通过包/类来限制它吗?
更新2:实际上, Spring与这一切几乎没有什么关系。在该网站的源代码中,有一个具有类似于以下字段的表单:
<input type="text" name="myType.foo" />
<input type="text" name="myType.bar" />我还没有JSP在我面前,但我假设它实际上将使用struts标记库。
<s:textfield name="myType.foo" label="Random string" />我已经看到如果我使用implements ModelDriven,我可以指定
@Override
public MyType getModel() {
return new MyTypeImpl();
}然而,这将“扁平”来自MyTypeImpl在ValueStack上的属性,如果我正确理解,我将不得不相应地更改表单元素的名称,例如,从myType.foo更改为简单的foo以使其工作。我不能这样做;我需要一个不需要更改表单/JSP的解决方案。
是否有一种“正常”/regular(即非模型驱动)方法也可以定义Struts2为MyType实例化哪些对象?
发布于 2017-03-14 09:14:55
Struts代表将动作豆自动装配到Spring。(没有进入Struts内部并说了很多话)。其他一切都由Spring来管理。Struts只使用配置使用的特定参数调用Spring。
如果你曾经使用过Spring,那么你应该知道自动装配是如何工作的。也就是说,您需要配置一个被自动配置的bean。通过放置注释@Autowired或使用Spring也支持的@javax.inject.Inject。
public class Action /* extends ... */ {
@Autowired
private MyType myType;
// getters and setters and other members omitted
public String doStuff() {
myType.foo(); // NPE
// ...
}
}然后配置MyType类型的bean (在Spring中)。就这样。如果有相同类型的多个实现,请将名称添加到允许解决歧义的组件或限定符中。
https://stackoverflow.com/questions/42765533
复制相似问题