2017-08-22 76 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