2016-12-05 2 views
0

) 봄 부팅시 'MultiViewResover'라는 viewResover를 추가하십시오. 컨트롤러 내가 'FTL이 :/프리 마커/테스트'돌아 오면 내가 '일 :/thymeleaf/테스트'돌아 오면 다음 MultiViewResover가 /freemarker/test.ftl봄 부팅시 'MultiViewResover'라는 새 viewResover를 추가하는 방법 (봄 부팅시

을 FreeMarkerViewResolver를 사용하여 찾을 수 있습니다 다음 MultiViewResover은/프리 마커를 찾을 수 ThymeleafViewResolverand 사용 에서 /test.html

여기 Application.java

public class Application extends WebMvcConfigurerAdapter{ 

    public static void main(String[] args) { 
     SpringApplication app = new SpringApplication(Application.class); 
     app.addInitializers(); 
     app.run(args); 
    } 

    @Autowired 
    MultiViewResover resover; 

    @Bean(name = "viewResover") 
    public MultiViewResover getViewResolver() { 
     InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver(); 
     internalResourceViewResolver.setViewClass(JstlView.class); 
     internalResourceViewResolver.setPrefix("/"); 
     internalResourceViewResolver.setSuffix(".jsp"); 

     ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver(); 
     thymeleafViewResolver.setViewClass(ThymeleafView.class); 

     FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver(); 
     freeMarkerViewResolver.setPrefix(""); 
     freeMarkerViewResolver.setSuffix(".ftl"); 

     Map<String, ViewResolver> resolvers = new HashedMap(); 
     resolvers.put("jsp",internalResourceViewResolver); 
     resolvers.put("th",thymeleafViewResolver); 
     resolvers.put("ftl",freeMarkerViewResolver); 

     resover.setResolvers(resolvers); 
     return resover; 
    } 

    @Override 
    public void configureDefaultServletHandling(
      DefaultServletHandlerConfigurer configurer) { 
     configurer.enable(); 
    } 
} 

MultiViewResover.java

내 코드

입니다

@Component 
public class MultiViewResover implements ViewResolver { 

    private static Map<String, ViewResolver> resolvers ; 

    /** 
    * 默认视图类型为jsp视图 
    */ 
    private static final String DEFAULT_VIEW_TYPE = "jsp"; 

    @Override 
    public View resolveViewName(String viewName, Locale locale) throws Exception { 
     int n = viewName.lastIndexOf(":"); // 获取 
     String suffix = MultiViewResover.DEFAULT_VIEW_TYPE; 
     // 默认使用jsp视图 
     if (n != -1) { 
      // 有的话截取:前面的字符串 这里一般是jsp,ftl,vm,th与Map resolvers中的key匹配 
      suffix = viewName.substring(0, n); 
      // 取:后面的部分 那时真正的资源名.比如我们要使用hello.jsp 那viewName就应该是jsp:hello 
      viewName = viewName.substring(n+1); 
     } 
     // 根据:前面的字符串去获取托管的视图解析类对象 
     ViewResolver resolver = resolvers.get(suffix); 

     if (resolver != null) 
      return resolver.resolveViewName(viewName, locale); 
     return null; 
    } 

    public Map<String, ViewResolver> getResolvers() { 
     return resolvers; 
    } 

    public void setResolvers(Map<String, ViewResolver> resolvers) { 
     this.resolvers = resolvers; 
    } 

} 

MyController.java

@RequestMapping(value = "/test1",name = "test return th view",method = RequestMethod.GET) 
    public ModelAndView test1(){ 
     return thView("login"); 
    } 
public ModelAndView thView(String viewPath){ 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.setViewName("th:"+viewPath); 
     return modelAndView; 
    } 

하지만 난이 응용 프로그램을 실행할 때 예외

Caused by: java.lang.IllegalStateException: ApplicationObjectSupport instance [or[email protected]40e94dde] does not run in an ApplicationContext 
    at org.springframework.context.support.ApplicationObjectSupport.getApplicationContext(ApplicationObjectSupport.java:141) 
    at org.springframework.web.servlet.view.UrlBasedViewResolver.applyLifecycleMethods(UrlBasedViewResolver.java:513) 
    at org.springframework.web.servlet.view.UrlBasedViewResolver.loadView(UrlBasedViewResolver.java:508) 
    at org.springframework.web.servlet.view.AbstractCachingViewResolver.createView(AbstractCachingViewResolver.java:244) 
    at org.springframework.web.servlet.view.UrlBasedViewResolver.createView(UrlBasedViewResolver.java:472) 
    at org.springframework.web.servlet.view.AbstractCachingViewResolver.resolveViewName(AbstractCachingViewResolver.java:156) 
    at me.luger.core.mvc.controller.MultiViewResover.resolveViewName(MultiViewResover.java:51) 
    at me.luger.core.mvc.controller.MultiViewResover$$FastClassBySpringCGLIB$$8118b2de.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) 
    at me.luger.core.log.aspect.ControllerLogAspect.doAround(ControllerLogAspect.java:38) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629) 
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618) 
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    at me.luger.core.mvc.controller.MultiViewResover$$EnhancerBySpringCGLIB$$c7c3b2b9.resolveViewName(<generated>) 
    at org.springframework.web.servlet.view.ContentNegotiatingViewResolver.getCandidateViews(ContentNegotiatingViewResolver.java:299) 
    at org.springframework.web.servlet.view.ContentNegotiatingViewResolver.resolveViewName(ContentNegotiatingViewResolver.java:220) 
    at org.springframework.web.servlet.DispatcherServlet.resolveViewName(DispatcherServlet.java:1296) 
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1234) 
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    ... 25 common frames omitted 

감사를 던져!

답변

0

InternalResourceViewResolverWebApplicationObjectSupport으로 확장되므로 응용 프로그램 컨텍스트가 필요합니다. 그래서 Bean으로 작성해야합니다.

스프링에 의해 이미 지원되는 것을 얻으려고 시도 했으므로이 MultiViewResolver의 요점을 볼 수 없다는 점에 유의하십시오. 이미 여러 개의보기 확인자를 추가하고 독립적으로 유지할 수 있습니다. 구현은 모든 템플릿 엔진을 하나로 묶어서 일부보기 확인자 (예 : InternalResourceViewResolver)가보기를 해결할 수없고 다른보기를 다른보기와 함께 다른 해결 자와 함께 볼 수있는 경우 예외를 throw한다는 사실을 간과합니다.

관련 문제