使用 spring 引导将抽象参数传递给 requestMapping 函数
pass abstract parameter to requestMapping function with spring boot
我有一个摘要class"Agent"
和其他 3 个子 classes "Developer"、"Support" 和 "Admin"
这里是"Agent"的代码源:
@Entity
@Table(name = "agents")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "role", discriminatorType =
DiscriminatorType.STRING, length = 3)
public abstract class Agent implements Serializable {
@Id
@GeneratedValue
private int id;
private String name;
private String lastName;
.........}
"Developer"的代码来源classe
@Entity
@DiscriminatorValue("dev")
public class Developer extends Agent {
/*------------------- constructors -------------------*/
public Developer() {
super();
}
public Developer(String name, String lastName, ....) {
super(name, lastName, ...);
}
}
其余 classes "Admin", "Supprort" 具有相同的形式。
这是我的控制器代码管理控制器:
@Controller
public class AdminController {
/*------- attributs -------*/
@Autowired
@Resource(name = "admin")
private IAdmin iAdmin;
@Autowired
private AgentValidator agentValidator;
........
@RequestMapping(value = "/admin/save/developer", method = RequestMethod.POST)
public String createAgentAccount(Model model, String admin_id, String confirmPassword, String action, @ModelAttribute("agent") Developer developer, BindingResult result) {
Agent admin = iAdmin.profile(Integer.parseInt(admin_id));
developer.setConfirmPassword(confirmPassword);
agentValidator.validate(developer, result);
if (result.hasErrors()) {
model.addAttribute("action", action);
return "formAgents";
}
if (action.equals("create")) {
iAdmin.createAgent(admin, developer);
} else {
iAdmin.updateAgent(admin, developer);
}
return "redirect:/admin/show/agents";
}
.......
如您所见,此功能创建和更新开发者帐户,但我需要保存所有代理类型 [admin、developer、support],我试试这个:
public String createAgentAccount(Model model, ... , @ModelAttribute("agent") Agent developer, BindingResult result) {.....}
但是我得到这个错误:
Tue Aug 22 19:54:03 WEST 2017
There was an unexpected error (type=Internal Server Error, status=500).
Failed to instantiate [com.GemCrmTickets.entities.Agent]: Is it an abstract class?; nested exception is java.lang.InstantiationException
我知道实例化一个抽象是不可能的Class。我不想为每种类型的代理做一个功能,一劳永逸将是最好的解决方案。所以我需要你的帮助。还有谢谢。
你的答案是一个字。使用Ad hoc polymorphism
,这意味着你可以有多个createAgentAccount
的方法,然后在每个方法中调用另一个方法来处理细节。
更新
这就是我想你想要的
@RequestMapping(value = "/admin/save/developer", method = RequestMethod.POST)
public String createAgentAccount(Model model, String admin_id, String confirmPassword, String action, @ModelAttribute("agent") Developer developer, BindingResult result) {
return createAgentAccount(model, admin_id, confirmPassword, action, developer, result);
}
@RequestMapping(value = "/admin/save/support", method = RequestMethod.POST)
public String createAgentAccount(Model model, String admin_id, String confirmPassword, String action, @ModelAttribute("agent") Support support, BindingResult result) {
return createAgentAccount(model, admin_id, confirmPassword, action, support, result);
}
private String createAccount(Model model, String admin_id, String confirmPassword, String action, Agent agent, BindingResult result) {
Agent admin = iAdmin.profile(Integer.parseInt(admin_id));
agent.setConfirmPassword(confirmPassword);
agentValidator.validate(agent, result);
if (result.hasErrors()) {
model.addAttribute("action", action);
return "formAgents";
}
if (action.equals("create")) {
iAdmin.createAgent(admin, agent);
} else {
iAdmin.updateAgent(admin, agent);
}
return "redirect:/admin/show/agents";
}
我有一个摘要class"Agent" 和其他 3 个子 classes "Developer"、"Support" 和 "Admin"
这里是"Agent"的代码源:
@Entity
@Table(name = "agents")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "role", discriminatorType =
DiscriminatorType.STRING, length = 3)
public abstract class Agent implements Serializable {
@Id
@GeneratedValue
private int id;
private String name;
private String lastName;
.........}
"Developer"的代码来源classe
@Entity
@DiscriminatorValue("dev")
public class Developer extends Agent {
/*------------------- constructors -------------------*/
public Developer() {
super();
}
public Developer(String name, String lastName, ....) {
super(name, lastName, ...);
}
}
其余 classes "Admin", "Supprort" 具有相同的形式。
这是我的控制器代码管理控制器:
@Controller
public class AdminController {
/*------- attributs -------*/
@Autowired
@Resource(name = "admin")
private IAdmin iAdmin;
@Autowired
private AgentValidator agentValidator;
........
@RequestMapping(value = "/admin/save/developer", method = RequestMethod.POST)
public String createAgentAccount(Model model, String admin_id, String confirmPassword, String action, @ModelAttribute("agent") Developer developer, BindingResult result) {
Agent admin = iAdmin.profile(Integer.parseInt(admin_id));
developer.setConfirmPassword(confirmPassword);
agentValidator.validate(developer, result);
if (result.hasErrors()) {
model.addAttribute("action", action);
return "formAgents";
}
if (action.equals("create")) {
iAdmin.createAgent(admin, developer);
} else {
iAdmin.updateAgent(admin, developer);
}
return "redirect:/admin/show/agents";
}
.......
如您所见,此功能创建和更新开发者帐户,但我需要保存所有代理类型 [admin、developer、support],我试试这个:
public String createAgentAccount(Model model, ... , @ModelAttribute("agent") Agent developer, BindingResult result) {.....}
但是我得到这个错误:
Tue Aug 22 19:54:03 WEST 2017
There was an unexpected error (type=Internal Server Error, status=500).
Failed to instantiate [com.GemCrmTickets.entities.Agent]: Is it an abstract class?; nested exception is java.lang.InstantiationException
我知道实例化一个抽象是不可能的Class。我不想为每种类型的代理做一个功能,一劳永逸将是最好的解决方案。所以我需要你的帮助。还有谢谢。
你的答案是一个字。使用Ad hoc polymorphism
,这意味着你可以有多个createAgentAccount
的方法,然后在每个方法中调用另一个方法来处理细节。
更新 这就是我想你想要的
@RequestMapping(value = "/admin/save/developer", method = RequestMethod.POST)
public String createAgentAccount(Model model, String admin_id, String confirmPassword, String action, @ModelAttribute("agent") Developer developer, BindingResult result) {
return createAgentAccount(model, admin_id, confirmPassword, action, developer, result);
}
@RequestMapping(value = "/admin/save/support", method = RequestMethod.POST)
public String createAgentAccount(Model model, String admin_id, String confirmPassword, String action, @ModelAttribute("agent") Support support, BindingResult result) {
return createAgentAccount(model, admin_id, confirmPassword, action, support, result);
}
private String createAccount(Model model, String admin_id, String confirmPassword, String action, Agent agent, BindingResult result) {
Agent admin = iAdmin.profile(Integer.parseInt(admin_id));
agent.setConfirmPassword(confirmPassword);
agentValidator.validate(agent, result);
if (result.hasErrors()) {
model.addAttribute("action", action);
return "formAgents";
}
if (action.equals("create")) {
iAdmin.createAgent(admin, agent);
} else {
iAdmin.updateAgent(admin, agent);
}
return "redirect:/admin/show/agents";
}