【问题标题】:Abstract class as attribute in Interface which will be overwritten to child class抽象类作为接口中的属性,将被覆盖到子类
【发布时间】:2017-05-03 13:57:36
【问题描述】:

鉴于Bean 是一个抽象类并且Venue 类扩展Bean。 ControllerInterface 是一个接口,VenueController 实现了这个接口。

界面

public interface ControllerInterface {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public List getAll();

    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
    public Bean getOneById(@PathVariable(value = "id", required = true) String id);

    @RequestMapping(value = "/{id}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public @ResponseBody Bean updateOne(@PathVariable("id") String id,Bean beanData);

    @RequestMapping(value = "/", method = RequestMethod.POST)
    public String addOne();
}

普通班

public class VenueController implements ControllerInterface{

    @Autowired
    VenueDAO venueDAO;

    @Override
    public List<Venue> getAll() {
        return venueDAO.findAll();
    }

    @Override
    public Bean getOneById(@PathVariable(value = "id", required = true) String id) {
        return venueDAO.findBy(id);
    }

    @Override
    public String addOne() {
        // TODO : add a new venue and return its id
        return null;
    }

    @Override
    @RequestMapping(value = "/{id}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public @ResponseBody Bean updateOne(@PathVariable("id") String id, Bean data) {
        Venue venueData = (Venue) data;
        Venue venue = venueDAO.findBy(id);
        Util.copyNonNullProperties(venueData, venue);
        venueDAO.update(venue);
        return null;
    }


}

显然这段代码会导致public @ResponseBody Bean updateOne(@PathVariable("id") String id, Bean data) 中的 InstantiationException 因为 Bean 是一个抽象类,没有办法初始化它。

所以我的问题是如何使这成为可能? 我想过将 Bean data 更改为 Venue data 但它不起作用,因为这会更改方法签名并且不会被覆盖。

有什么想法吗?

【问题讨论】:

    标签: java spring inheritance spring-boot


    【解决方案1】:

    只是一些建议要小心你的注释方法被继承,我发现很多次我的注释没有执行,这些错误变得很难追踪。

    您将需要使用泛型ControllerInterface&lt;SOME extends Bean&gt;,然后使用SOME 而不是Bean

    问候

    【讨论】:

    • 感谢您的建议,我以为我以前从未遇到过这个问题(它总是继承注释),但我明白为什么它可能不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多