インターフェイスを実装するアクション クラスがありModelDrivenます。これModelDrivenは通常の POJO です。問題は、そのプロパティの 1 つが別のオブジェクトであることです。
私の ModelDriven is a object calledPerson and my person has an attribute calledAddress that is another object.Address has regular properties such asString , Long などを想像してみてください。
フォームを送信するときの JSP ではString、 、int、longinなどの通常のプロパティPersonはすべて正しくマップされますが、アドレスにマップする必要があるすべてのデータは正しくマップされません。
<s:textfield name="name" id="name" size="25" maxlength="15" />
<s:textfield name="address.zipcode" id="zipcode" size="25" maxlength="15" />
それが私がプロパティをマッピングしようとする方法です。名前のプロパティは正しく理解できますが、個人の住所にプロパティをマッピングする場合、このアプローチは機能しません。
私は何を間違っていますか?
やがて、私のAddressプロパティはPersonオブジェクトのインスタンス化で宣言されるので、決してnull.
編集:要求に応じて、アクション ソースと DTO:
アクション:
@Controller
@Scope("request")
public class AnAction extends BaseAction implements ModelDriven<FakeDTO> {
    private static final long serialVersionUID = 8238033889271514835L;
    @Autowired
    private FakeFacade facade;
    private FakeDTO fakeDTO = new FakeDTO();
    public String action01() {
        return Action.SUCCESS;
    }
    public String action02() {
        this.fakeDTO.setAnswer(this.fakeFacade.fakeFacadeMethod(this.fakeDTO.getComplexObject()));
        return Action.SUCCESS;
    }
    @Override
    public FakeDTO getModel() {
        return this.fakeDTO;
    }
}
メインクラスFakeDTO:
public class FakeDTO implements BaseDTO {
    private static final long serialVersionUID = -2093038083351846003L;
    private FakeFilterDTO filter = new FakeFilterDTO();
    private String name;
    public FakeDTO() {
        super();
    }
    @Override
    public FakeFilterDTO getFilter() {
        return this.filter;
    }
    public void setFilter(final FakeFilterDTO filterParam) {
        this.filter = filterParam;
    }
    public String getName() {
        return this.name;
    }
    public String setName(final String nameParam) {
        this.name = nameParam;
    }
}
クラスFakeFilterDTO:
public class FakeFilterDTO extends BaseFilterDTO {
    private static final long serialVersionUID = 4528040257605851210L;
    private Date aDate;
    private Long aLong;
    private Integer anInteger;
    private String aString;
    public Date getADate() {
        return this.aDate;
    }
    public void setDataInicial(final Date aDateParam) {
        this.aDate = aDateParam;
    }
    public Long getALong() {
        return this.aLong;
    }
    public void setALong(final Long aLongParam) {
        this.aLong = aLongParam;
    }
    public Integer getAnInteger() {
        return this.anInteger;
    }
    public void setAnInteger(final Integer anIntegerParam) {
        this.anInteger = anIntegerParam;
    }
    public String getAString() {
        return this.aString;
    }
    public void setAString(final String aStringParam) {
        this.aString = aStringParam;
    }
}
struts.xml:_
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <struts>
    <include file="META-INF/bsad/struts2/struts-config.xml" />
    <package name="reports" namespace="/reports" extends="project-default">
        <action name="anAction" class="anAction" method="action01">
            <result>/WEB-INF/pages/success.jsp</result>
            <result name="input">/WEB-INF/pages/input.jsp</result>
        </action>
    <action name="generateReport" class="anAction" method="action02">
            <result>/WEB-INF/pages/reportGenerated.jsp</result>
        </action>
    </package>
</struts>
は、 をproject-default含む include struts-config.xmland extendsstruts-defaultパッケージに配置されますModelDrivenInterceptor。このインターセプターとそこを通過するブレークポイントにブレークポイントを配置したため、それを保証できます。
前に例として使用した JSP は次のようになります。
<s:textfield name="name" id="name" size="25" maxlength="15" />
<s:textfield name="filter.aString" id="zipcode" size="25" maxlength="15" />
会社のポリシーにより、実際のオブジェクトとその名前をコピー/貼り付けすることは許可されていません。しかし、それがアイデアです。