使用 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";
}