抽象类作为Interface中的属性,将被覆盖到子类

时间:2017-05-03 13:57:37

标签: java spring inheritance spring-boot

鉴于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,但它不起作用,因为这会更改方法签名并且不会被覆盖。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

只是一些建议要小心你的注释方法被继承,我已经多次发现我的注释没有完成,这些错误变得非常难以追踪。

您需要使用泛型ControllerInterface<SOME extends Bean>,然后使用SOME代替Bean

此致