1

i hv an application which always return jsp file as a view from spring controller. shown below :

@RequestMapping("/home")
public class HomeController {
@RequestMapping(value = "", method = RequestMethod.GET)
public ModelAndView home(HttpServletResponse response){
    ModelAndView modelView = new ModelAndView("home")
    return modelView;
}


@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/content/**").addResourceLocations("WEB-INF/content/");
}

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

but now in place of home.jsp i have to return index.html for this particular mapping. the html file is located in a different folder not in /WEB-INF/views/ but in user/src .

i've tried using something like this , setting the order of view resolvers , i hv seen this code somewhere on internet , which checks if the file is exist in the path or not. but it did not work for me .

it always trying to find the index in WEB-INF/views/ and failed so.

 @Bean
  public ViewResolver htmlViewResolver() {
    UrlBasedViewResolver resolver = new ChainableUrlBasedViewResolver();
    resolver.setPrefix("/client/src/");
    resolver.setSuffix(".html");
    resolver.setOrder(0);
    return resolver;
  }

@Bean
public InternalResourceViewResolver setupViewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    viewResolver.setOrder(1);
    return viewResolver;
}


public class ChainableUrlBasedViewResolver extends UrlBasedViewResolver {

  public ChainableUrlBasedViewResolver() {
      setViewClass(InternalResourceView.class);
  }

  @Override
  protected AbstractUrlBasedView buildView(String viewName) throws Exception {
    String url = getPrefix() + viewName + getSuffix();
    InputStream stream = getServletContext().getResourceAsStream(url);
    if (stream == null) {
      return new NonExistentView();
    }
    return super.buildView(viewName);
  }

  private static class NonExistentView extends AbstractUrlBasedView {
    @Override
    protected boolean isUrlRequired() {
        return false;
    }

    @Override
    public boolean checkResource(Locale locale) throws Exception {
      return false;
    }
    @Override
    protected void renderMergedOutputModel(Map<String, Object> model,
                                           HttpServletRequest request,
                                           HttpServletResponse response) throws Exception {
      // Purposely empty, it should never get called
    }
  }
}

any idea how to do this using Spring.

avi
  • 175
  • 2
  • 5
  • 17

0 Answers0