Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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 SpringDataRest和show欢迎文件列表/禁用链接发现_Java_Spring_Spring Mvc_Spring Data Rest - Fatal编程技术网

Java SpringDataRest和show欢迎文件列表/禁用链接发现

Java SpringDataRest和show欢迎文件列表/禁用链接发现,java,spring,spring-mvc,spring-data-rest,Java,Spring,Spring Mvc,Spring Data Rest,我在SpringMVC应用程序中使用SpringDataREST(1.0.0.RELEASE) 但我有以下问题 在我的网络配置中 @Import(RepositoryRestMvcConfiguration.class) public static class WebConfiguration extends WebMvcConfigurationSupport{...} 在这里,本例的RepositoryRestMvcConfiguration有一个beanRepositoryRestCon

我在SpringMVC应用程序中使用SpringDataREST(1.0.0.RELEASE) 但我有以下问题

在我的网络配置中

@Import(RepositoryRestMvcConfiguration.class)
public static class WebConfiguration extends WebMvcConfigurationSupport{...}
在这里,本例的
RepositoryRestMvcConfiguration
有一个bean
RepositoryRestController
,它的方法
listRepositories(…)

@RequestMapping(value = "/", method = RequestMethod.GET)
现在的问题是,当我点击根上下文
(“/”
)时,我会得到指向我的存储库的链接,如下所示

{
  "links" : [ {
    "rel" : "content",
    "href" : "http://localhost:7070/appName/content"
  }, {
    "rel" : "language",
    "href" : "http://localhost:7070/appName/language"
  } ],
  "content" : [ ]
}

但是我想显示index.html文件

我想禁用根上下文中的链接发现

我尝试使用自定义控制器将事件映射到根上下文
(“/”
,但第一优先级的spring与
RepositoryRestController的.listRepositories(…)
方法匹配

这不是我的控制器方法。 在日志中,它是这样来的

**RepositoryRestHandlerMapping**: 185 - Mapped "{[/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositoryRestController.listRepositories(org.springframework.http.server.ServletServerHttpRequest,java.net.URI) throws java.io.IOException
**RequestMappingHandlerMapping**: 185 - Mapped "{[/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String xxx.xx.xx.AccessController.getIndex()
**RepositoryRestHandlerMapping**:185-将“{[/],methods=[GET],params=[],headers=[],consumes=[],products=[],custom=[],”映射到public org.springframework.http.ResponseEntity org.springframework.data.rest.webmvc.RepositoryRestController.listRepositoryController.listRepositories(org.springframework.http.server.ServletServerHttpRequest,java.net.URI)抛出java.io.IOException
**RequestMappingHandlerMapping**:185-将“{[/],方法=[GET],参数=[],头=[],消耗=[],生产=[],自定义=[]}”映射到公共java.lang.String xxx.xx.xx.AccessController.getIndex()上

我也遇到过同样的问题,并通过以下方式解决了它:

1) 切换到spring data rest webmvc 1.1.0.M1

2) 将上下文配置拆分为web配置和rest配置

WebConfig.java

@Configuration
@EnableHypermediaSupport
@EnableSpringDataWebSupport
@EnableWebMvc
@ComponentScan(basePackages = {"com.yourcompanyname.XXX"})
public class WebConfig extends WebMvcConfigurationSupport {

@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass( JstlView.class );
    viewResolver.setPrefix( "/WEB-INF/views/" );
    viewResolver.setSuffix( ".jsp" );
    return viewResolver;
}

@Bean
public ReloadableResourceBundleMessageSource messageSource()
{
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename( "/resources/messages" );
    messageSource.setCacheSeconds( 0 );
    return messageSource;
}

@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.defaultContentType(MediaType.APPLICATION_JSON);
}


@Override
@Bean
public RequestMappingHandlerMapping requestMappingHandlerMapping() {

    RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping() {

        @Override
        protected boolean isHandler(Class<?> beanType) {
            return beanType == null || ClassUtils.getPackageName(beanType).startsWith("org.springframework.data") ? false
                    : super.isHandler(beanType);
        }
    };

    handlerMapping.setOrder(0);
    handlerMapping.setInterceptors(getInterceptors());
    handlerMapping.setContentNegotiationManager(mvcContentNegotiationManager());

    return handlerMapping;
}

@Override
@Bean
public HandlerMapping resourceHandlerMapping() {
    AbstractHandlerMapping handlerMapping = (AbstractHandlerMapping) super.resourceHandlerMapping();
    handlerMapping.setOrder(-1);
    return handlerMapping;
}

@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926);
}
@Configuration
public class RESTConfig extends RepositoryRestMvcConfiguration {
}
然后创建webapp初始值设定项类,以替换web.xml中的注册(servlet api 3.0+必需)。在下面的示例中,spring数据rest路径被设置为/rest/,也包括了我自己的JPA配置类。我们将在两个单独的类中注册2个servlet,一个用于main/,另一个用于“/rest/”路径:

WebAppInitializer.java

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

/*
* (non-Javadoc)
* @see org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer#getRootConfigClasses()
*/
@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { JpaConfig.class };
}

/*
 * (non-Javadoc)
 * @see org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer#getServletConfigClasses()
 */
@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebConfig.class };
}

/*
 * (non-Javadoc)
 * @see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#getServletMappings()
 */
@Override
protected String[] getServletMappings() {
    return new String[] { "/" };
}



/*
 * (non-Javadoc)
 * @see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#getServletFilters()
 */
@Override
protected javax.servlet.Filter[] getServletFilters() {
    return new javax.servlet.Filter[] { new OpenEntityManagerInViewFilter() };
}
公共类WebAppInitializer扩展了AbstractAnnotationConfigDispatchersServletInitializer{
/*
*(非Javadoc)
*@请参见org.springframework.web.servlet.support.AbstractAnnotationConfigDispatchersServletInitializer#getRootConfigClasses()
*/
@凌驾
受保护类[]getRootConfigClasses(){
返回新类[]{JpaConfig.Class};
}
/*
*(非Javadoc)
*@请参见org.springframework.web.servlet.support.AbstractAnnotationConfigDispatchersServletInitializer#getServletConfigClasses()
*/
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[]{WebConfig.Class};
}
/*
*(非Javadoc)
*@see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#getServletMappings()
*/
@凌驾
受保护的字符串[]getServletMappings(){
返回新字符串[]{”/“};
}
/*
*(非Javadoc)
*@see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#getServletFilters()
*/
@凌驾
受保护的javax.servlet.Filter[]getServletFilters(){
返回新的javax.servlet.Filter[]{new OpenEntityManagerInViewFilter()};
}
}

RestAppConfig.java

public class RestAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

/*
* (non-Javadoc)
* @see org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer#getRootConfigClasses()
*/
@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { JpaConfig.class };
}

/*
 * (non-Javadoc)
 * @see org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer#getServletConfigClasses()
 */
@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { RESTConfig.class };
}

/*
 * (non-Javadoc)
 * @see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#getServletMappings()
 */
@Override
protected String[] getServletMappings() {
    return new String[] { "/rest/*" };
}



/*
 * (non-Javadoc)
 * @see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#getServletFilters()
 */
@Override
protected javax.servlet.Filter[] getServletFilters() {
    return new javax.servlet.Filter[] { new OpenEntityManagerInViewFilter() };
}
公共类重新打包初始化器扩展AbstractAnnotationConfigDispatcherServletInitializer{
/*
*(非Javadoc)
*@请参见org.springframework.web.servlet.support.AbstractAnnotationConfigDispatchersServletInitializer#getRootConfigClasses()
*/
@凌驾
受保护类[]getRootConfigClasses(){
返回新类[]{JpaConfig.Class};
}
/*
*(非Javadoc)
*@请参见org.springframework.web.servlet.support.AbstractAnnotationConfigDispatchersServletInitializer#getServletConfigClasses()
*/
@凌驾
受保护类[]getServletConfigClasses(){
返回新类[]{RESTConfig.Class};
}
/*
*(非Javadoc)
*@see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#getServletMappings()
*/
@凌驾
受保护的字符串[]getServletMappings(){
返回新字符串[]{“/rest/*”};
}
/*
*(非Javadoc)
*@see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer#getServletFilters()
*/
@凌驾
受保护的javax.servlet.Filter[]getServletFilters(){
返回新的javax.servlet.Filter[]{new OpenEntityManagerInViewFilter()};
}

}以下是我是如何做到这一点的

  • 子类RepositoryRestMvcConfiguration,然后引发一些自定义异常

  • 在建议的控制器中捕获异常并返回“index.html”

  • 使用子类在配置中导入

  • 第一步 步骤3 这解决了我的问题

    @Configuration
    public class CustomRepositoryRestMvcConfiguration extends RepositoryRestMvcConfiguration {
        @Override
        public RepositoryRestController repositoryRestController() throws Exception {
            RepositoryRestController restController = new RepositoryRestController(){
                @Override
                public ResponseEntity<?> listRepositories(ServletServerHttpRequest request, URI baseUri) throws IOException {
                    throw new RootContextRepositoryException();                
                }
            };
    
            return restController;
        }
    }
    
    @ControllerAdvice
    public class BaseAdvisedController {
    
        @ExceptionHandler({RootContextRepositoryException.class})
        public String rootContextRepositoryExceptionHandler(RootContextRepositoryException ex){
            return "index.html";
        }
    
    }
    
    @Import(CustomRepositoryRestMvcConfiguration.class)
    public static class WebConfiguration extends WebMvcConfigurationSupport{...}