В настоящее время у меня есть приложение Spring Boot, которое использует React JS для внешнего интерфейса.Я работаю в Visual Studio и через веб-пакет собираю ресурсы и выводю их в целевую папку Maven.Вы можете увидеть структуру каталога с классами Java, расположенными внутри папки 'classes', и клиентским приложением, находящимся теперь внутри папки webapp - обратите внимание на index.html.
Поскольку это одностраничное приложение, мне нужна только эта страница для разрешения.Таким образом, мой контроллер настроен на возврат файла индекса.
@SpringBootApplication
public class AdminApplication
{
public static void main( String[] args )
{
SpringApplication.run( AdminApplication.class, args );
}
}
@Controller
public class DefaultController
{
@RequestMapping( "/**" )
public ModelAndView reactApp()
{
return new ModelAndView( "index" );
}
}
Сейчас.Моя проблема заключается в том, что я говорю своему распознавателю о просмотре с этим каталогом.
Как видно из прокомментированного кода, я пробовал всего пару сотен вариантов, чтобы попытаться получить его для разрешения представления.У меня есть полный путь к файлу моего каталога проекта, доступный на documentRoot, поэтому, если это необходимо, я подумал, что мне это может понадобиться.
Я установил точку останова в контроллере, и это определенно получает удар, он просто возвращает 404 при попытке найти соответствующий вид каждый раз.Любое руководство о том, как может выглядеть мой viewResolver, должно быть оценено.Я вижу, что есть пара классов, которые могут быть или не быть правильными:
например SpringResourceTemplateResolver и ClassLoaderTemplateResolver - не уверен, какой из них наиболее актуален для моих требований
@EnableWebMvc
@Configuration
public class MvcConfig implements WebMvcConfigurer,ApplicationContextAware {
private ApplicationContext context;
@Value("${server.document-root:}")
private String documentRoot;
@Override
public void setApplicationContext( ApplicationContext applicationContext ) {
this.context = applicationContext;
}
// private ITemplateResolver htmlTemplateResolver() {
// SpringResourceTemplateResolver resolver = new
// SpringResourceTemplateResolver();
// resolver.setApplicationContext(applicationContext);
// resolver.setPrefix(documentRoot);
// resolver.setCacheable(false);
// resolver.setTemplateMode(TemplateMode.HTML);
// return resolver;
// }
// @Bean
// public SpringResourceTemplateResolver templateResolver() {
// SpringResourceTemplateResolver templateResolver = new
// SpringResourceTemplateResolver();
// templateResolver.setPrefix( "/webapp/" );
// templateResolver.setCacheable(false);
// templateResolver.setSuffix(".html");
// templateResolver.setTemplateMode("HTML");
// return templateResolver;
// }
private ITemplateResolver templateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(context);
resolver.setPrefix("templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
return resolver;
}
// public ITemplateResolver templateResolver() {
// ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
// templateResolver.setPrefix("templates/");
// templateResolver.setCacheable(false);
// templateResolver.setSuffix(".html");
// templateResolver.setTemplateMode(TemplateMode.HTML);
// templateResolver.setCharacterEncoding("UTF-8");
// return templateResolver;
// }
}

