Vue.JS & Spring Boot - Перенаправление на домашнюю страницу на 404 - PullRequest
0 голосов
/ 04 марта 2019

Я создаю приложение Vue.JS & Spring Boot, которое запускаю через докер-контейнер.Папка dist для Vue копируется в ресурсный / публичный путь и обслуживается службой Spring Boot.

Я настроил маршруты с помощью маршрутизатора vue, но все эти маршруты возвращают 404 - Not found при вводе непосредственно в браузер (но работают нормально при доступе через приложение Vue).

Маршрутизатор vue:

    export default new Router({
  mode: 'history',
  routes: [{
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/result',
      name: 'result',
      component: Result,
      props: true
    },
    {
      path: '/result/:userid',
      name: 'autoResult',
      component: Result,
      props: true
    }
  ]
})

Мне нужен / result / userid, чтобы не возвращать 404 - вместо этого получите идентификатор пользователя и отобразите страницу результатов.Это возможно, чтобы добраться до работы?

Еще одна вещь, которую я хочу сделать, - это перенаправить все 404 страницы, которые не сопоставлены с любой страницей API / VUE, чтобы вернуться на стартовую страницу.Я попытался использовать загрузочную пружину implements ErrorController, но я не могу заставить работать редирект.

Редактировать:

Я попытался добавить следующий совет контроллера:

@ControllerAdvice
public class WebConfig {

    @ExceptionHandler(NoHandlerFoundException.class)
    public String renderDefaultPage(NoHandlerFoundException e) {
        return "classpath:public/index.html";
    }

}

И следующие свойства:

spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:public/static/

Но когда я пытаюсьполучить доступ к главной странице сейчас (или любой другой URL) я получаю stackOverflowException и сервер начинает выполнять бесконечный цикл, говоря это:

2019-03-05 13:26:24.298  WARN 22044 --- [nio-8080-exec-1] o.s.web.servlet.PageNotFound             : No mapping for GET /classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/classpath:public/index.html

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Решено с помощью следующего кода:

@Controller
public class RoutesController implements ErrorController {
    private static final String PATH = "/error";

    @RequestMapping(value = PATH)
    public String error() {
        return "forward:/";
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}
0 голосов
/ 04 марта 2019

Что происходит в вашем случае, так это то, что Spring boot принимает запросы и, поскольку ничто не сопоставлено с URL, дает вам 404. Вместо этого вы хотите, чтобы приложение Vue.js могло обрабатывать несопоставленные URL-адреса.(То есть, перенаправьте все не сопоставленные URL-адреса в ваш index.html).

Первое, что вам нужно сделать, это добавить это в конфигурацию ваших маршрутов в вашем маршрутизаторе:

export default new Router({
    mode: 'history',
    routes: [{
        path: '/',
        name: 'home',
        component: Home
    },
    {
        path: '/result',
        name: 'result',
        component: Result,
        props: true
    },
    {
        path: '/result/:userid',
        name: 'autoResult',
        component: Result,
        props: true
    },
    {
        path: '*',
        component: NotFound
    }
  ]
})

Здесь мы добавилидополнительный маршрут в качестве последнего пути (потому что маршруты сопоставляются последовательно), который отображает компонент.

После этого вам нужно заставить загрузку Spring перенаправлять каждый несопоставленный запрос в index.html, чтобы сделать это, выЯ хочу, чтобы spring сгенерировала исключение, когда оно находит и отображает маршрут и в обработчике исключения перенаправляет на ваш index.html.

Сначала добавьте эту строку в ваше application.properties:

spring.mvc.throw-exception-if-no-handler-found=true

И добавьте ControllerAdvice для обработки брошенного исключения, например:

//In some controller or inside a @ControllerAdvice annotated class
@ExceptionHandler(NoHandlerFoundException.class)
String noHandlerFound(NoHandlerFoundException ex){
    return "classpath:index.html";
}

Здесь вы можете найти немного больше информации оn сделать загрузку Spring перенаправить несопоставленные запросы в ваш index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...