web-dev-qa-db-ja.com

Javaアノテーションを使用したViewResolver

Spring 3.1.1では、Javaアノテーションを使用してビューリゾルバを構成できますか?

Javaアノテーションを使用してすべての構成を完了しましたが、view resolverで立ち往生しています。).

コード

package com;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@ComponentScan("com")
public class AppConfig
{
    {
          //Other bean declarations
    }

    @Bean
    public UrlBasedViewResolver urlBasedViewResolver()
    {
        UrlBasedViewResolver res = new InternalResourceViewResolver();
        res.setViewClass(JstlView.class);
        res.setPrefix("/WEB-INF/");
        res.setSuffix(".jsp");

        return res;
    }
}

このコードを使用してアプリケーションを実行しましたが、適切なビューが返されません。ただし、app-servlet.xmlファイルでviewresolverを構成すると、正常に動作します。

21
Ravi Jain

クラスはWebMvcConfigurerAdapterクラスを拡張する必要があります。以下の例をご覧ください

@Configuration
@ComponentScan(basePackages="com")
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{

    @Bean
    public ViewResolver getViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}
33
Ramesh Kotha

Spring 4.3.4でシナリオをテストしましたが、問題なく動作しています。スキャンしたパッケージを再確認し、AppConfigが適切に提供されていることをお勧めします。 AppConfigから始まるすべてのファイルを添付しています。しかし、WebMvcConfigurerAdapterを拡張するのは良いことです。添付されているソースコードは理想的ではなく、単純化されており、報告された問題の再現のみを試みます。

AppConfigから開始:

package com;

import org.springframework.context.annotation.*;
import org.springframework.web.servlet.view.*;

@Configuration
@ComponentScan("com")
public class AppConfig {
    @Bean
    public UrlBasedViewResolver getViewResovler() {
        UrlBasedViewResolver urlBasedViewResolver = new UrlBasedViewResolver();
        urlBasedViewResolver.setViewClass(JstlView.class);
        urlBasedViewResolver.setPrefix("/WEB-INF/jsp/");
        urlBasedViewResolver.setSuffix(".jsp");
        return urlBasedViewResolver;
    }

}

次に:

package com;

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

    public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {

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

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

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

最終的に:

package com;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MainController {

    @RequestMapping("/")
    public ModelAndView asdf() {
        return new ModelAndView("ABC");
    }
}
1
Witold Kaczurba

上記の問題は、Bean getViewResolverが定義される前にDispatcherServlet.initViewResolversが呼び出され、Beanが見つからないためビューリゾルバーが追加されないことです。

Bean定義をxml定義に移動すると、それが取得されます。何らかの理由で、定義したMvcConfigurationクラスは、XMLにViewResolverが定義されていない場合、DispatcherServletの更新をトリガーしません。

0
Allen