I have a Model-Driven Struts2 action that provides correct JSON response. When I re-structure the action I get an empty JSON response back. Has anyone got inheritance working with Struts2 Model-Driven actions?
Ive tried explicitly setting include properties in struts config:
<result name="json" type="json"> <param name="includeProperties"> jsonResponse </param> </result>
Code for all actions below - not actual code in use - I have edited and stripped down for clarity.
Thanks in advance.
Action providing correct response:
public class Bike extends ActionSupport implements ModelDriven, Preparable { @Autowired private Service bikeService; private JsonResponse jsonResponse; private com.ets.model.Vehicle bike; private int id; public Bike() { jsonResponse = new JsonResponse("Bike"); } @Override public void prepare() throws Exception { if (id == 0) { bike = new com.ets.model.Bike(); } else { bike = bikeService.find(id); } } @Override public Object getModel() { return bike; } public void setId(int id) { this.id = id; } public void setBikeService(@Qualifier("bikeService") Service bikeService) { this.bikeService = bikeService; } public JsonResponse getJsonResponse() { return jsonResponse; } publi开发者_StackOverflow中文版c String delete() { try { bike.setDeleted(new Date(System.currentTimeMillis())); bikeService.updateOrSave(bike); jsonResponse.addActionedId(id); jsonResponse.setAction("delete"); jsonResponse.setValid(true); } catch (Exception exception) { jsonResponse.setMessage(exception.toString()); } return "json"; } }
Re-structured Actions providing incorrect response:
public abstract class Vehicle extends ActionSupport implements ModelDriven { @Autowired protected Service bikeService; @Autowired protected Service carService; protected JsonResponse jsonResponse; protected com.ets.model.Vehicle vehicle; protected int id; protected abstract Service service(); @Override public Object getModel() { return bike; } public void setId(int id) { this.id = id; } public void setBikeService(@Qualifier("bikeService") Service bikeService) { this.bikeService = bikeService; } public void setCarService(@Qualifier("carService") Service carService) { this.carService = carService; } public JsonResponse getJsonResponse() { return jsonResponse; } public String delete() { try { vehicle.setDeleted(new Date(System.currentTimeMillis())); service().updateOrSave(vehicle); jsonResponse.addActionedId(id); jsonResponse.setAction("delete"); jsonResponse.setValid(true); } catch (Exception exception) { jsonResponse.setMessage(exception.toString()); } return "json"; } } public class Bike extends Vehicle implements Preparable { public Bike() { jsonResponse = new JsonResponse("Bike"); } @Override public void prepare() throws Exception { if (id == 0) { vehicle = new com.ets.model.Bike(); } else { vehicle = bikeService.find(id); } } @Override protected Service service() { return bikeService; } } public class Car extends Vehicle implements Preparable { public Car() { jsonResponse = new JsonResponse("Car"); } @Override public void prepare() throws Exception { if (id == 0) { vehicle = new com.ets.model.Car(); } else { vehicle = carService.find(id); } } @Override protected Service service() { return carService; } }
Moved type-specific code to child classes, and fixed getModel() to return the correct domain object:
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");
}
}
精彩评论