Is inheritance possible in Struts2 using model?
I have a Driven Struts2 action that provides a correct JSON response. When I restructure the activity, I get an empty JSON response. Has anyone gotten inheritance working with Struts2 Model-Driven Actions?
Ive tried to explicitly set include properties in config struts:
<result name = "json" type = "json">
<param name = "includeProperties">
jsonResponse
</param>
</result>
The code for all actions below is not valid code in use - for mine has been edited and removed.
Thanks in advance.
Action to provide the correct answer:
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;
}
public 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";
}
}
Restructured actions that provide the wrong answer:
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;
}
}
+2
a source to share
1 answer
Moved type code for child classes and corrected getModel () method to return 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");
}
}
0
a source to share