0

I want to override @RepositoryRestResource autogenerated controller methods using @RepositoryRestController having set the SDR's Base Path to "/api".

Spring Data Rest 3.0 (and earlier) says:

"This controller [as shown in the snippet] will be served from the same API base path defined in RepositoryRestConfiguration.setBasePath that is used by all other RESTful endpoints (e.g. /api)". https://docs.spring.io/spring-data/rest/docs/3.0.1.RELEASE/reference/html/#customizing-sdr.overriding-sdr-response-handlers (chapter 15.4)

This code snippet DOES NOT have a @RequestMapping on the class level, though.

My SDR app is configured with RepositoryRestConfiguration object

config.setBasePath("/api");

and yet @RepositoryRestController doesn't override SDR's autogenerated controller methods.

Please consider the accepted answear to this post: Spring Data Rest controllers: behaviour and usage of @BasePathAwareController, @RepositoryRestController, @Controller and @RestController

Please help me understand this! :)

AppConf.java:

@Configuration
@Import(value = {DataConf.class})
@EnableWebMvc
@ComponentScan(value = "pl.mydomain.controller")
public class AppConf
{
    @Bean
    public RepositoryRestConfigurer repositoryRestConfigurer() {
        return new RepositoryRestConfigurerAdapter() {
            public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
                config.setBasePath("/api");
            }
        };
    }
}

TokenController.java:

@RepositoryRestController
public class TokenController
{
    private TokenRepository repository;

    @Autowired
    public TokenController(TokenRepository tokenRepository) {
        this.repository = tokenRepository;
    }

    @RequestMapping(method = GET, path = "/tokens")
    public @ResponseBody ResponseEntity<?> tokens() 
    {    
        return ResponseEntity.ok("Hello");
    }
}

TokenRepository.java:

@RepositoryRestResource(path = "tokens")
public interface TokenRepository extends CrudRepository<Token, Long>{
}
Błażej Kocik
  • 1,689
  • 1
  • 17
  • 20
  • What do you want to achieve and what's the problem you're facing? – Marc Tarin Nov 23 '17 at 09:07
  • Autogenerated controller methods overriding discussed [here](https://stackoverflow.com/questions/36773171/spring-data-rest-override-repository-method-on-the-controller/36790697#36790697). – Marc Tarin Nov 23 '17 at 09:12
  • @marc-tarin, yes, the topic you've pointed out is ok, but what if you set the base path for SDR. Things change... My controller doesn't override autogen. methods. – Błażej Kocik Nov 23 '17 at 09:59

1 Answers1

1

The key to resolve the above dilemma was configuring the project in a correct fashion. That is, to put @ComponentScan in the class passed to AbstractAnnotationConfigDispatcherServletInitializer::getServletConfigClasses() method (not in AppConf.java passed to getRootConfigClasses()).

DispatcherConf.java:

public class DispatcherConf extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {AppConf.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {WebConf.class}; // !!!
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/*"};
    }
}

AppConf.java:

@Configuration
@Import({DataConf.class})
public class ApplicationConf
{
    @Bean
    public RepositoryRestConfigurer repositoryRestConfigurer() {
        return new RepositoryRestConfigurerAdapter() {
            @Override
            public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
                 config.setBasePath("/api"); // !!!
            }
        };
    }
}

DataConf.java:

@Configuration
@EnableJpaRepositories(basePackages = {
        "pl.example.data.repository"
})
@EnableTransactionManagement
public class DataConf
{ ... }

WebConf.java:

@Import(RepositoryRestMvcConfiguration.class)
@ComponentScan({"pl.example.api.controller"}) // !!!
public class WebConf {
}

Even if I solved the riddle I don't understand why it was an issue. The rather that https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html states:

Annotation Type ComponentScan onfigures component scanning directives for use with @Configuration classes.

Błażej Kocik
  • 1,689
  • 1
  • 17
  • 20