@RepositoryRestController是一个使用RepositoryRestMvcConfiguration和AbstractAnnotationConfigDispatcherServletInitializer的自定义控制器。

4
我正在尝试实现自定义控制器,以处理在自定义存储库中定义的方法,从而能够通过REST公开使用此方法的资源(根据 实现Spring Data存储库的自定义方法并通过REST公开它们)。以下是配置和其他相关代码:
public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

     @Override
     protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] {ApplicationConfig.class};
     }

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

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

}

应用配置:

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
public class ApplicationConfig {

    @Bean
    public DataSource dataSource() {
        // data source settings
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        // em factory settings
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        // tx mng settings
    }
}

实验仓库:

@RepositoryRestResource
public interface ExperimentRepository extends PagingAndSortingRepository<Experiment, Long>,
    ExperimentRepositoryCustom {

    @RestResource(rel = "byName", path = "byName")
    Page<Experiment> findByNameContaining(@Param("name") String name, Pageable pageable);

}

ExperimentRepositoryCustom:

public interface ExperimentRepositoryCustom {

    Page<Experiment> findUsingCustomFilter(...);

}

实验仓库实现:

public class ExperimentRepositoryImpl implements ExperimentRepositoryCustom {

    @Override
    public Page<Experiment> findUsingCustomFilter(...) {
        // search for experiment based on given filter
    }

}

实验控制器:

@RepositoryRestController
public class ExperimentController {

    @Autowired
    private ExperimentRepository experimentRepository;


    @RequestMapping(value = "/experiments/search/findByFilter", method= RequestMethod.GET)
    @ResponseBody
    public ResponseEntity<Experiment> searchUsingFilter(@RequestParam Long id) {
        // for test purpose call method from CrudRepository (will be replaced by findUsingCustomFilter(...)) 
        return new ResponseEntity(experimentRepository.findOne(id), HttpStatus.OK);
    }
}

项目结构:

basepackage.model.Experiment
basepackage.repository.ExperimentController
basepackage.repository.ExperimentRepository
basepackage.repository.ExperimentRepositoryImpl
basepackage.repository.ExperimentRepositoryCustom
basepackage.ApplicationInitializer
basepackage.ApplicationConfig

基于使用的存储库自动生成的链接所公开的所有资源都可以无障碍地访问。但是,在http://localhost:8080/app/api/experiments/search/findByFilter?id=1调用GET方法时,返回404错误(基于使用的存储库自动生成的链接所公开的资源工作正常)。我认为ExperimentController未在Spring容器中注册,或者我缺少有关控制器方法的其他设��。有什么建议吗?
提前致谢!
1个回答

2

您需要配置以加载您的控制器。一种方法是添加一个配置类来加载您的控制器,并将其添加到应用程序初始化器中。

//PLACE THIS IN A PACKAGE WHERE YOUR CONTROLLERS ARE
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;

@ComponentScan
@Import(RepositoryRestMvcConfiguration.class)
public class WebConfig {
}

修改你的 ApplicationInitializer 为:

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import com.spring.data.rest.test.web.WebConfig;

public class ApplicationInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { ApplicationConfig.class };
    }

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

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接