首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将接口用作Struts 2操作中属性(来自值堆栈)的数据类型?

如何将接口用作Struts 2操作中属性(来自值堆栈)的数据类型?
EN

Stack Overflow用户
提问于 2017-03-13 14:01:30
回答 1查看 199关注 0票数 0

我以前从未使用过Struts,所以我不确定我想做什么是可能的。

我有一个Action类,它有一个MyType属性:

代码语言:javascript
复制
public class Action /* extends ... */ {
  private MyType myType;
  // getters and setters and other members omitted

  public String doStuff() {
    myType.foo(); // NPE
    // ...
  }
}

我重构了代码(以实现装饰器模式,幸亏不知道Struts及其内部工作),并使MyType成为一个interfaceMyTypeImpl提供了它的实现。

现在,当操作被调用时,myTypenull,而在过去,它保存了MyType (现在的MyTypeImpl)的一个实例。

所以,我的问题基本上是:我能否让Struts很好地处理这个设置,即让它在MyTypeImpl类中使用MyType的属性,而不必更改实际的网页?(换句话说,如何在将所需更改的数量保持在最低限度的同时,使其工作?)

看看我们在类路径上是如何使用struts2-spring-plugin的,我认为Spring最终会注入myType的值,这让我希望它可以被配置?更新3:在深入研究这个问题之后,我不认为它与Spring有任何关系。Struts通过用户输入的值自动创建属性。这些属性似乎没有通过Spring连接起来。(如果是的话,它们就是prototype的,但我不知道如何填充它们的字段。)prototype是而不是,是一个服务bean!

更新:这里的是Spring配置的摘录--它似乎不相关,因为它没有提到MyType

代码语言:javascript
复制
<bean id=“Action” class=“com.example.Action" scope="prototype">
    <property name=“fooService” ref=“fooService”/>
    <property name=“barService” ref=“barService”/>
</bean>

Struts配置文件中的相关代码片段:

代码语言:javascript
复制
  <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与这一切几乎没有什么关系。在该网站的源代码中,有一个具有类似于以下字段的表单:

代码语言:javascript
复制
<input type="text" name="myType.foo" />
<input type="text" name="myType.bar" />

我还没有JSP在我面前,但我假设它实际上将使用struts标记库。

代码语言:javascript
复制
<s:textfield name="myType.foo" label="Random string" />

我已经看到如果我使用implements ModelDriven,我可以指定

代码语言:javascript
复制
@Override
public MyType getModel() {
  return new MyTypeImpl();
}

然而,这将“扁平”来自MyTypeImpl在ValueStack上的属性,如果我正确理解,我将不得不相应地更改表单元素的名称,例如,从myType.foo更改为简单的foo以使其工作。我不能这样做;我需要一个不需要更改表单/JSP的解决方案。

是否有一种“正常”/regular(即非模型驱动)方法也可以定义Struts2为MyType实例化哪些对象?

EN

回答 1

Stack Overflow用户

发布于 2017-03-14 09:14:55

Struts代表将动作豆自动装配到Spring。(没有进入Struts内部并说了很多话)。其他一切都由Spring来管理。Struts只使用配置使用的特定参数调用Spring。

如果你曾经使用过Spring,那么你应该知道自动装配是如何工作的。也就是说,您需要配置一个被自动配置的bean。通过放置注释@Autowired或使用Spring也支持的@javax.inject.Inject

代码语言:javascript
复制
public class Action /* extends ... */ {

  @Autowired
  private MyType myType;
  // getters and setters and other members omitted

  public String doStuff() {
    myType.foo(); // NPE
    // ...
  }
}

然后配置MyType类型的bean (在Spring中)。就这样。如果有相同类型的多个实现,请将名称添加到允许解决歧义的组件或限定符中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42765533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档