2017-08-22 48 views
1

我有一个抽象类“代理” 和3个其他子类“开发”“支持”“管理”通抽象的参数与春天开机requestMapping功能

这里是“代理” 的代码源:

@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; 

.........} 

“开发” 的代码源CLASSE

@Entity 
@DiscriminatorValue("dev") 

public class Developer extends Agent { 

/*------------------- constructors -------------------*/ 
public Developer() { 
    super(); 
} 


public Developer(String name, String lastName, ....) { 

    super(name, lastName, ...); 

} 

}

类的其余部分 “管理”, “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"; 

} 

....... 

正如你看到这个函数创建和更新开发者账户,但我需要保存所有代理类型[管理员,开发人员,支持],我试试这个:

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 

我知道这是不可能的牛逼o instanciate抽象类。我不想为每种类型的代理做一个功能,一个人就是最好的解决方案。所以我需要你的帮助。谢谢你。

回答

0

你的答案是一个单词。使用Ad hoc polymorphism,这意味着你可以有多种方法createAgentAccount,然后在其中每个方法调用其他方法来处理细节。

UPDATE 这就是我想你想

@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"; 
} 
+0

你可以给我一个例子,请! – Mostafa

+0

我更新了帖子。 – hadilq

+0

是的,这是谢谢你:) – Mostafa