Struts2 模型驱动动作中的继承可能吗?

Posted

技术标签:

【中文标题】Struts2 模型驱动动作中的继承可能吗?【英文标题】:Is Inheritance in Struts2 Model-Driven Action possible? 【发布时间】:2011-02-13 18:20:11 【问题描述】:

我有一个模型驱动的 Struts2 操作,可提供正确的 JSON 响应。当我重新构建操作时,我得到一个空的 JSON 响应。有没有人使用 Struts2 模型驱动操作获得继承?

我尝试在 struts 配置中明确设置包含属性:

json响应 结果>

下面所有操作的代码 - 不是实际使用的代码 - 为了清楚起见,我已经编辑和剥离。

提前致谢。

提供正确响应的操作:

公共类 Bike 扩展 ActionSupport 实现 ModelDriven,Preparable @Autowired 私人服务自行车服务; 私人 JsonResponse jsonResponse; 私人 com.ets.model.Vehicle 自行车; 私人 int id; 公共自行车() jsonResponse = new JsonResponse("Bike"); @覆盖 公共无效准备()抛出异常 如果(id == 0) 自行车 = 新的 com.ets.model.Bike(); 别的 自行车 = bikeService.find(id); @覆盖 公共对象 getModel() 归还自行车; 公共无效setId(int id) 这个.id = id; 公共无效setBikeService(@Qualifier(“bikeService”)服务bikeService) this.bikeService = 自行车服务; 公共 JsonResponse getJsonResponse() 返回json响应; 公共字符串删除() 尝试 自行车.setDeleted(新日期(System.currentTimeMillis())); bikeService.updateOrSave(自行车); jsonResponse.addActionedId(id); jsonResponse.setAction("删除"); jsonResponse.setValid(true); 捕捉(异常异常) jsonResponse.setMessage(exception.toString()); 返回“json”;

提供错误响应的重组操作:

公共抽象类 Vehicle 扩展 ActionSupport 实现 ModelDriven @Autowired 受保护的服务自行车服务; @Autowired 受保护的服务汽车服务; 受保护的 JsonResponse jsonResponse; 受保护的 com.ets.model.Vehicle 车辆; 受保护的 int id; 受保护的抽象服务服务(); @覆盖 公共对象 getModel() 归还自行车; 公共无效setId(int id) 这个.id = id; 公共无效setBikeService(@Qualifier(“bikeService”)服务bikeService) this.bikeService = 自行车服务; 公共无效 setCarService(@Qualifier("carService") 服务 carService) this.carService = 汽车服务; 公共 JsonResponse getJsonResponse() 返回json响应; 公共字符串删除() 尝试 车辆.setDeleted(新日期(System.currentTimeMillis())); 服务()。更新或保存(车辆); jsonResponse.addActionedId(id); jsonResponse.setAction("删除"); jsonResponse.setValid(true); 捕捉(异常异常) jsonResponse.setMessage(exception.toString()); 返回“json”; 公共类 Bike 扩展 Vehicle 实现 Preparable 公共自行车() jsonResponse = new JsonResponse("Bike"); @覆盖 公共无效准备()抛出异常 如果(id == 0) 车辆 = 新 com.ets.model.Bike(); 别的 车辆 = bikeService.find(id); @覆盖 受保护的服务服务() 返还自行车服务; 公共类 Car 扩展 Vehicle 实现 Preparable 公共汽车() jsonResponse = new JsonResponse("汽车"); @覆盖 公共无效准备()抛出异常 如果(id == 0) 车辆 = 新的 com.ets.model.Car(); 别的 车辆 = carService.find(id); @覆盖 受保护的服务服务() 还车服务;

【问题讨论】:

您的示例中的自行车和车辆字段之间似乎有些混淆,您能否澄清您的示例并验证它是否可以编译? 【参考方案1】:

将特定类型的代码移至子类,并修复 getModel() 以返回正确的域对象:

public abstract class Vehicle extends ActionSupport
        implements ModelDriven, Preparable 

    protected int id;

    protected abstract Service service();
    public abstract void setService(Service service);
    public abstract JsonResponse getJsonResponse();

    public void setId(int id) 
        this.id = id;
    

    public String delete() 
        JsonResponse jsonResponse = getJsonResponse();
        try 
            getModel().setDeleted(new Date(System.currentTimeMillis()));
            service().updateOrSave(getModel());
            jsonResponse.addActionedId(id);
            jsonResponse.setAction("delete");
            jsonResponse.setValid(true);
         catch (Exception exception) 
            jsonResponse.setMessage(exception.toString());
        
        return "json";
    


public class Bike extends Vehicle 

    @Autowired protected Service bikeService;
    private com.ets.model.Bike model;

    @Override
    public void prepare() throws Exception 
        if (id == 0) 
            model = new com.ets.model.Bike();
         else 
            model = bikeService.find(id);
        
    

    @Override
    public Object getModel() 
        return model;
    

    @Override
    protected Service service() 
        return bikeService;
    

    @Override
    public void setService(@Qualifier("bikeService") Service bikeService) 
        this.bikeService = bikeService;
    

    @Override
    public JsonResponse getJsonResponse() 
        return new JsonResponse("Bike");
    


public class Car extends Vehicle 

    @Autowired protected Service carService;
    private com.ets.model.Car model;

    @Override
    public void prepare() throws Exception 
        if (id == 0) 
            model = new com.ets.model.Car();
         else 
            model = carService.find(id);
        
    

    @Override
    public Object getModel() 
        return model;
    

    @Override
    protected Service service() 
        return carService;
    

    @Override
    public void setService(@Qualifier("carService") Service carService) 
        this.carService = carService;
    

    @Override
    public JsonResponse getJsonResponse() 
        return new JsonResponse("Car");
    

【讨论】:

以上是关于Struts2 模型驱动动作中的继承可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

struts2属性驱动模型

使用继承类中的字段的 Django 模型约束条件 - 可能吗?

Struts2— Result结果配置Servlet的API的访问模型驱动属性驱动

Struts2 属性驱动模型驱动异常机制

struts2 模型驱动封装

Struts2属性驱动和模型驱动