0

spring-mvc アプリケーションで spring-data-rest(1.0.0.RELEASE) を使用していますが、次の問題が発生しています

私のWebConfigで

@Import(RepositoryRestMvcConfiguration.class)
public static class WebConfiguration extends WebMvcConfigurationSupport{...}

ここで、このケースには、メソッドに注釈が付けられRepositoryRestMvcConfigurationた Beanがあります。RepositoryRestControllerlistRepositories(...)

@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 ファイルを表示したいです。

ルート コンテキストでのリンクの検出を無効にしたい。

カスタムコントローラーでルートコンテキストにマップしようとしたイベントですが、("/")最優先のスプリングがRepositoryRestController's.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()
4

2 に答える 2

0

これが私がこれを達成した方法です

  1. サブクラス化された RepositoryRestMvcConfiguration 、次にいくつかのカスタム例外をスローします

  2. Advised Controllerで例外をキャッチし、「index.html」を返します

  3. サブクラスのクラスを使用して構成にインポートする

ステップ1

@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;
    }
}

ステップ2

@ControllerAdvice
public class BaseAdvisedController {

    @ExceptionHandler({RootContextRepositoryException.class})
    public String rootContextRepositoryExceptionHandler(RootContextRepositoryException ex){
        return "index.html";
    }

}

ステップ 3

@Import(CustomRepositoryRestMvcConfiguration.class)
public static class WebConfiguration extends WebMvcConfigurationSupport{...}

これは私の問題を解決しました

于 2013-07-04T05:07:55.190 に答える
0

私は同じ問題に直面し、次のように解決しました:

1) spring-data-rest-webmvc 1.1.0.M1 に切り替え

2) コンテキスト構成を web-config と rest-config に分割します

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);
}

RESTConfig.java

@Configuration
public class RESTConfig extends RepositoryRestMvcConfiguration {
}

次に、web.xml の登録を置き換える webapp 初期化クラスを作成します (servlet-api 3.0 以降が必要です)。次の例では、 spring-data-rest パスが /rest/に設定されており、独自の提案用の JPA 構成クラスも含まれています。2 つの別々のクラスに 2 つのサーブレットを登録します。1 つはメインの「/」用で、もう 1 つは「/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() };
}

}

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() };
}

}

于 2013-07-02T13:48:03.083 に答える