2017-08-22 6 views
1

J'ai une classe abstraite "Agent" et 3 autres sous-classes "Développeur", "Support" et "Admin"passe paramètre abstrait à la fonction requestMapping avec botte de printemps

Voici ce la source de code de "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; 

.........} 

la source de code de "développeur" 01

classe
@Entity 
@DiscriminatorValue("dev") 

public class Developer extends Agent { 

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


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

    super(name, lastName, ...); 

} 

}

Le reste des classes "Admin", "Supprort" a la même forme.

Voici mon code contrôleur contrôleur Admin:

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

} 

....... 

Comme vous le voyez cette fonction créer et mettre à jour le compte de développeur, mais je dois enregistrer tous les types d'agents [admin, développeur, support], je tente cette :

public String createAgentAccount(Model model, ... , @ModelAttribute("agent") Agent developer, BindingResult result) {.....} 

Mais je reçois cette erreur:

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 

Je sais que cela est impossible t o instancier une classe abstraite. Je ne veux pas faire une fonction pour chaque type d'agent, Un pour tous sera la meilleure solution. J'ai donc besoin de votre aide s'il vous plait. Et merci.

Répondre

0

Votre réponse est un mot. Utilisez Ad hoc polymorphism, ce qui signifie que vous pouvez avoir plusieurs méthodes de createAgentAccount, puis dans chacune d'entre elles, appelez une autre méthode pour gérer les détails.

MISE À JOUR Voici ce que je pense que vous voulez

@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

pouvez-vous me donner un exemple s'il vous plaît! – Mostafa

+0

J'ai mis à jour le post. – hadilq

+0

oui ça merci :) – Mostafa