0

我對Struts2比較陌生。 我已經開始使用ModelDriven來減少開發中的開銷。 我想編寫一個接口來修改一個屬性,但是我沒有看到如何訪問爲模型實現ModelDriven的類的屬性。Struts2 - 實現ModelDriven - 創建一個訪問模型屬性的攔截器

我可以看到像validate()這樣的事情可以像在實際操作類中一樣工作。 我改變了設計來封裝服務背後的邏輯,但仍然想知道這是否可能。

我們正在通過ajax/json做所有事情,所以我發現modeldriven有相當多的幫助 - 不知道是否有更好的替代方案!

編輯 - 代碼示例:

試圖在一個模板,一個消息來替換消息中的電子郵件正文中使用。

public class EmailActionImpl implements EmailAction { 

private Email email=new Email();  
private EmailService emailService; 

public Email getModel(){ 
    return email; 
} 
[... getters and setters ...] 

    public String execute(){ 
    logger.info("Email action is sendind an email..."); 

    try{ 
     emailService.sendNewMail(email); 
    }catch(Exception e){ 
     logger.error("Email not sent: " + e.getMessage()); 
     return "failure"; 
    } 
    return "success"; 
} 
} 

電子郵件模型是這樣的

@Entity 
@Table(name="email") 
public class Email { 
private Long id; 
private String from; 
private String to; 
private String message; 
private String templateType; 
[...] 
} 

我想攔截預處理器,以取代email.message。 應該看起來像這樣,但action.getMessage/setMessage不可用。

public class SimpleInterceptor extends AbstractInterceptor { 

public String intercept(ActionInvocation invocation) throws Exception { 
    EmailAction action = (EmailAction)invocation.getAction(); 
    action.setMessage(MessageTemplateFactoryImpl(action.getMessage(), action.getTemplateType()); 
    return invocation.invoke(); 
} 
} 
+0

如果我明白它的權利,你想修改從表單中設置的屬性? – 2012-03-22 16:08:42

+0

你究竟想要做什麼?不知道這很難說。您可以修改請求中的值,但實現自己的類型轉換器通常更有意義。這兩種方法都涵蓋了很多情況,並避免檢查操作並直接使用自己的攔截器設置值。 – Quaternion 2012-03-22 18:46:34

+0

我會盡快發佈代碼示例。 – JasonG 2012-03-22 18:59:47

回答

0

如果你仍然想實現攔截到一組特定的模型工作,然後你會如果action實現了模型驅動檢查。通過反射(或Apache bean utils),您可以派生出相關的特定模型,以確定您的攔截器是否適用,然後相應地對其執行操作。

+0

偉大 - 真實 - 反思。剛纔昨天學到了這個概念。這將是一個有趣的實驗。 – JasonG 2012-03-27 12:00:26