简体   繁体   中英

@Autowired abstract class from subclass

I have a controller for REST services for a particular type of resources (Symptoms) that looks like this:

@RequestMapping(value = "/symptom", produces = "application/json")
public class SymtomController {

    @Autowired
    private SymptomRepository repository;

    @Autowired
    private SymptomResourceAssembler assembler;

    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<Collection<SymptomResource>> findAllSymptoms() {

        List<SymptomEntity> symptoms = repository.findAll();
        return new ResponseEntity<>(assembler.toResourceCollection(symptoms), HttpStatus.OK);
    }
    ...
}

But, as I need to produce more controllers, for other resources, I would like to generate an abstract class and subclasses

public class AbstractController<Entity extends AbstractEntity, Resource extends GenericResource {

    // repository and assembler somehow transferred from subclasses

    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity<Collection<Resource>> findAllResources() {

        List<Entity> entities = repository.findAll();
        return new ResponseEntity<>(assembler.toResourceCollection(entities), HttpStatus.OK);
    }
    ...
}

@RequestMapping(value = "/symptom", produces = "application/json")
public class SymtomController extends ResourceController<SymptomEntity, SymptomResource>{

    @Autowired
    private SymptomRepository repository;

    @Autowired
    private SymptomResourceAssembler assembler;

    ...
}

But I do not know it is possible, somehow, to transfer the autowired elements in the subclasses to the abstract class in a nice way (ie not sending them as parameters on each function call).

Any ideas?

Move the dependencies to the parent.

abstract class Parent {    
    @Autowired
    protected MyRepository repo;

    @PostConstruct
    public void initialize(){
        System.out.println("Parent init");
        Assert.notNull(repo, "repo must not be null");
    }
}

@Component
class Child extends Parent {    
    @PostConstruct
    public void init(){
        System.out.println("Child init");
        Assert.notNull(repo, "repo must not be null");
    }    
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM