Java @RepositoryRestController带有RepositoryRestMVCCConfiguration和AbstractAnnotationConfigDispatchers ServletInitializer的自定义控制器
我试图实现自定义控制器来处理自定义存储库中定义的方法,以便能够通过REST(根据)使用此方法公开资源 以下是配置和其他相关代码:Java @RepositoryRestController带有RepositoryRestMVCCConfiguration和AbstractAnnotationConfigDispatchers ServletInitializer的自定义控制器,java,spring,spring-data-jpa,spring-data-rest,Java,Spring,Spring Data Jpa,Spring Data Rest,我试图实现自定义控制器来处理自定义存储库中定义的方法,以便能够通过REST(根据)使用此方法公开资源 以下是配置和其他相关代码: public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { retur
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/*"};
}
}
实验存储库:
@RepositoryRestResource
public interface ExperimentRepository extends PagingAndSortingRepository<Experiment, Long>,
ExperimentRepositoryCustom {
@RestResource(rel = "byName", path = "byName")
Page<Experiment> findByNameContaining(@Param("name") String name, Pageable pageable);
}
通过基于已用存储库自动生成的链接公开的所有资源都可以访问,没有问题,但在404结束时调用GET方法(通过基于已用存储库自动生成的链接公开的资源工作正常)。我假设ExperimentController未在Spring容器中注册,或者我缺少一些关于控制器方法的附加设置。有什么建议吗
提前谢谢 您需要配置才能加载控制器。一种方法是添加一个配置类来加载控制器并将其添加到ApplicationInitializer
//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/*" };
}
}
import org.springframework.web.servlet.support.abstractAnnotationConfigDispatchers服务初始化器;
导入com.spring.data.rest.test.web.WebConfig;
公共类ApplicationInitializer扩展
AbstractAnnotationConfigDispatchersServletInitializer{
@凌驾
受保护类[]getRootConfigClasses(){
返回新类[]{ApplicationConfig.Class};
}
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[]{WebConfig.Class};
}
@凌驾
受保护的字符串[]getServletMappings(){
返回新字符串[]{“/api/*”};
}
}
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
//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 {
}
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/*" };
}
}