Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @RepositoryRestController带有RepositoryRestMVCCConfiguration和AbstractAnnotationConfigDispatchers ServletInitializer的自定义控制器_Java_Spring_Spring Data Jpa_Spring Data Rest - Fatal编程技术网

Java @RepositoryRestController带有RepositoryRestMVCCConfiguration和AbstractAnnotationConfigDispatchers ServletInitializer的自定义控制器

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

我试图实现自定义控制器来处理自定义存储库中定义的方法,以便能够通过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/*"};
     }

}
实验存储库:

@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/*" };
    }

}