Ta aplikacja nie ma wyraźnego mapowania dla błędu /

108

Użyłem mavena do wykonania samouczka https://spring.io/guides/gs/uploading-files/
Wszystkie użyte kody zostały skopiowane.

Aplikacja może działać, ale pojawia się błąd:

Strona błędu białej etykiety Ta aplikacja nie ma wyraźnego mapowania błędu /, więc widzisz to jako rezerwę. Tue Jun 30 17:24:02 CST 2015 Wystąpił nieoczekiwany błąd (typ = Nie znaleziono, stan = 404). Brak wiadomości

Jak mogę to naprawić?

Deng Steve
źródło
dodał Twój komentarz do wpisu - możesz go samodzielnie edytować. To lepsze niż komentowanie własnego postu
Alexander

Odpowiedzi:

137

Upewnij się, że Twoja główna klasa znajduje się w pakiecie głównym nad innymi klasami.

Kiedy uruchamiasz Spring Boot Application (tj. Klasę z adnotacją @SpringBootApplication), Spring skanuje tylko klasy poniżej głównego pakietu klas.

com
   +- APP
         +- Application.java  <--- your main class should be here, above your controller classes
         |
         +- model
         |   +- user.java
         +- controller
             +- UserController.java
vignesh Subash
źródło
4
Powyżej czy na tym samym poziomie?
Martin Erlic
21
Spędziłem prawie 2 godziny mojego życia, aby to rozgryźć!
Rakesh
7
Próbowałem tego też. Nadal błąd. Przynajmniej strona główna, czyli localhost: 8080, powinna pokazywać mi stronę domową Tomcat, prawda? Ale to też się nie pokazuje
zulkarnain shah
Dzięki za podpowiedź. Kiedyś byłem użytkownikiem Eclipse i tam ta konfiguracja nie była potrzebna, ale teraz używam IntelliJ i było to bardzo obiecujące.
Armer B.
@zulkarnainshah Zwykła strona domowa tomcat jest generowana przez WOJNĘ, której tutaj nie ma.
Thorbjørn Ravn Andersen
61

Kiedy tworzymy aplikację rozruchową Springa, opisujemy ją @SpringBootApplicationadnotacją. Ta adnotacja „zamyka” wiele innych niezbędnych adnotacji, aby aplikacja działała. Jedną z takich adnotacji jest @ComponentScanadnotacja. Ta adnotacja nakazuje Springowi wyszukanie komponentów Spring i skonfigurowanie aplikacji do uruchomienia.

Twoja klasa aplikacji musi znajdować się na szczycie hierarchii pakietów, aby Spring mógł przeskanować pakiety podrzędne i znaleźć inne wymagane składniki.

package com.test.spring.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

Poniższy fragment kodu działa, ponieważ pakiet kontrolera znajduje się w com.test.spring.bootpakiecie

package com.test.spring.boot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @RequestMapping("/")
    public String home(){
        return "Hello World!";
    }
}

Poniższy fragment kodu NIE działa, ponieważ pakiet kontrolera NIE znajduje się w com.test.spring.bootpakiecie

package com.test.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

     @RequestMapping("/")
     public String home(){
         return "Hello World!";
     }
 }

Z dokumentacji Spring Boot:

Wielu programistów Wiosna Boot zawsze mają ich główne klasy z adnotacją @Configuration, @EnableAutoConfigurationi @ComponentScan. Ponieważ te adnotacje są tak często używane razem (zwłaszcza jeśli postępujesz zgodnie z powyższymi sprawdzonymi metodami), Spring Boot stanowi wygodną @SpringBootApplicationalternatywę.

@SpringBootApplicationAdnotacja jest równoważne użyciu @Configuration, @EnableAutoConfigurationa @ComponentScanich domyślnych atrybutów

musibs
źródło
3
Bardzo ładne wyjaśnienie. Dziękuję
Lova Chittumuri
39

Możesz rozwiązać ten problem, dodając plik ErrorControllerw swojej aplikacji. Kontroler błędów może zwrócić widok, którego potrzebujesz.

Error Controller w mojej aplikacji wygląda jak poniżej:

import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * Basic Controller which is called for unhandled errors
 */
@Controller
public class AppErrorController implements ErrorController{

    /**
     * Error Attributes in the Application
     */
    private ErrorAttributes errorAttributes;

    private final static String ERROR_PATH = "/error";

    /**
     * Controller for the Error Controller
     * @param errorAttributes
     */
    public AppErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    /**
     * Supports the HTML Error View
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH, produces = "text/html")
    public ModelAndView errorHtml(HttpServletRequest request) {
        return new ModelAndView("/errors/error", getErrorAttributes(request, false));
    }

    /**
     * Supports other formats like JSON, XML
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request));
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

    /**
     * Returns the path of the error page.
     *
     * @return the error path
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }


    private boolean getTraceParameter(HttpServletRequest request) {
        String parameter = request.getParameter("trace");
        if (parameter == null) {
            return false;
        }
        return !"false".equals(parameter.toLowerCase());
    }

    private Map<String, Object> getErrorAttributes(HttpServletRequest request,
                                                   boolean includeStackTrace) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return this.errorAttributes.getErrorAttributes(requestAttributes,
                includeStackTrace);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request
                .getAttribute("javax.servlet.error.status_code");
        if (statusCode != null) {
            try {
                return HttpStatus.valueOf(statusCode);
            }
            catch (Exception ex) {
            }
        }
        return HttpStatus.INTERNAL_SERVER_ERROR;
    }
}

Powyższa klasa jest oparta na klasie Springs BasicErrorController .

Możesz utworzyć powyższą instancję ErrorControllerw @Configurationpliku:

 @Autowired
 private ErrorAttributes errorAttributes;

 @Bean
 public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}

Możesz wybrać przesłonięcie wartości domyślnej ErrorAttributes, implementując ErrorAttributes . Ale w większości przypadków DefaultErrorAttributes powinno wystarczyć.

owaizm
źródło
1
Twój link do BasicErrorControllerklas 404.
Stephane
@owaism: Link do BasicErrorControllernie jest już dobry, czy możesz zaktualizować?
HDJEMAI
1
Link do BasicErrorControllerjest teraz naprawiony.
axiopisty
15

W moim przypadku klasa kontrolera została opatrzona adnotacją @Controller. Zmiana tego, aby @RestControllerrozwiązać problem. Zasadniczo @RestControllerjest @Controller + @ResponseBody więc albo użyj @RestController, albo @Controllerz @ResponseBodyadnotacjami dla każdej metody.

Kilka przydatnych informacji tutaj: https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/

mój klucz
źródło
Działa, ale zgodnie z przykładami w całym Internecie podstawowa konfiguracja powinna działać z @Controller. Czy ktoś jest świadomy tego powodu, dla którego działa tylko RestController?
supernowa
Podczas @RestControllerdodawania @ResponseBodyadnotacji do klasy niejawnie dodaje adnotację, ale jeśli używasz @Controlleradnotacji, musisz jawnie dodać tę adnotację samodzielnie.
Robin Keskisarkka
10

w moim przypadku jest to spowodowane pozycją pakietu, co oznacza, że ​​pakiet kontrolera musi znajdować się powyżej pakietu głównej klasy

jeśli moim głównym pakietem klas jest package co.companyname.spring.tutorial;jakikolwiek pakiet kontrolera powinienpackage co.companyname.spring.tutorial.WHAT_EVER_HERE;

package co.companyname.spring.tutorial; // package for main class
@SpringBootApplication
public class FirstProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(FirstProjectApplication.class, args);
    }
}


package co.companyname.spring.tutorial.controllers; // package for controllers 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController 
public class HelloController { 

@RequestMapping("/hello")  
public String hello() {   
 return "Hello, world"; 
 }}

po zakończeniu kodowania naciśnij panel startowy

wprowadź opis obrazu tutaj

Ostatnia rzecz, aby upewnić się, że kontroler mapuje, czy nie jest tylko konsolą, powinieneś zobaczyć coś smilliar

Mapped "{[/hello]}" onto public java.lang.String co.companyname.spring.tutorial.controllers.HelloController.hello()

szczęśliwego kodowania

Mina Fawzy
źródło
9

Spróbuj dodać zależność.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Sree
źródło
2
co to właściwie robi?
Stealth Rabbi
Dodałem tę zależność i zadziałało. Podobnie jak @StealthRabbi ... Zastanawiam się też, co to właściwie robi.
twindham
@StealthRabbi To dodaje zależność do struktury szablonów o nazwie Thymeleaf, która jest alternatywą i preferowanym podejściem do JSP. Ta odpowiedź nie jest prawdziwą odpowiedzią imo, omijanie zależności nie pomaga nikomu, kto jest naprawdę zainteresowany podstawową kwestią
Christian
9

Dzieje się tak, gdy nie zdefiniowano jawnej strony błędu. Aby zdefiniować stronę błędu, utwórz odwzorowanie błędu / z widokiem. np. poniższy kod odwzorowuje wartość ciągu zwracaną w przypadku błędu.

package com.rumango.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController implements ErrorController{
    private final static String PATH = "/error";
    @Override
    @RequestMapping(PATH)
    @ResponseBody
    public String getErrorPath() {
        // TODO Auto-generated method stub
        return "No Mapping Found";
    }

}
prabhat kumar
źródło
Czy możesz dodać wyjaśnienie do swojego kodu? Dlaczego rozwiązuje pytanie, które są kluczowe?
Nico Haase,
Jest jedna rzecz, na którą należy zwrócić uwagę w tej odpowiedzi w odniesieniu do Spring Boot, która na początku spowodowała u mnie ból głowy. Ważne jest, aby zaimplementować interfejs ErrorController springframework. Jeśli utworzysz punkt końcowy kontrolera zamapowany na „/ error” bez zrobienia tego, pojawi się błąd informujący, że metoda jest już zmapowana.
mmaynar1
5

Dodałem tę zależność i to rozwiązało mój problem.

<dependency>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Ekene Oguikpu
źródło
Oto moja teoria: jeśli używamy „@Controller”, w jakiś sposób Spring wymagałby od nas posiadania określonego silnika szablonów. A w tym przypadku Thymeleaf. Dlatego wymagany jest rozrusznik sprężynowy-rozrusznik-grasica. Natomiast jeśli używamy „@RestController”, Spring Boot nie wymagałby silnika szablonów. I dlatego działa bez Thymeleaf.
Yosi Pramajaya
4

Rozwijam aplikację Spring Boot przez kilka tygodni .. Otrzymałem ten sam błąd, co poniżej;

Strona błędu białej etykiety Ta aplikacja nie ma wyraźnego mapowania błędu /, więc widzisz to jako rezerwę. Thu Jan 18 14:12:11 AST 2018 Wystąpił nieoczekiwany błąd (typ = nie znaleziono, stan = 404). Brak wiadomości

Kiedy otrzymuję ten komunikat o błędzie, zdałem sobie sprawę, że moja klasa kontrolera lub kontrolera odpoczynku jest zdefiniowana w moim projekcie. Chodzi mi o to, że wszystkie nasze pakiety kontrolerów nie są tym samym pakietem z klasą główną, która zawiera adnotację @SpringBootApplication .. Chodzi mi o to, że musisz dodać nazwę pakietu kontrolera do adnotacji @ComponentScan do swojej głównej klasy, która zawiera adnotację @SpringBootApplication.Jeśli piszesz kody poniżej twój problem zostanie rozwiązany ... Najważniejsze jest to, że musisz dodać cały pakiet kontrolera do adnotacji @ComponentScan, tak jak to zrobiłem poniżej

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({ "com.controller.package1, com.controller.package2, com.controller.package3, com.controller.packageN", "controller", "service" } // If our Controller class or Service class is not in the same packages we have //to add packages's name like this...directory(package) with main class
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class, args);
    }
}

Mam nadzieję, że te kody komuś pomogą ...

Jeśli znajdziesz inny sposób rozwiązania tego błędu lub masz dla mnie sugestie, napisz do komentarzy ... dzięki ...

Semih Erkaraca
źródło
4

W głównej klasie, po konfiguracji „@SpringBootApplication”, dodanie „@ComponentScan” bez żadnych argumentów zadziałało !!!

Klasa główna:

@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {

    public static void main(String[] args) {
        SpringApplication.run(CommentStoreApplication.class, args);

    }
}

Klasa RestController:

@RestController
public class CommentStoreApp {

    @RequestMapping("/") 
    public String hello() {
        return "Hello World!";
    }
}

PS: Nie przegap polecenia mvn clean i mvn install przed uruchomieniem aplikacji

Harika
źródło
4

Dość późno na przyjęcie. Zgodnie z oficjalną dokumentacją wiosny „Spring Boot instaluje stronę błędu z własnym wyglądem, która jest wyświetlana w kliencie przeglądarki w przypadku napotkania błędu serwera”. https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page

  1. Możesz wyłączyć tę funkcję, ustawiając ją server.error.whitelabel.enabled=falsew pliku application.yml lub application.properties .

2. Zalecanym sposobem jest ustawienie strony błędu tak, aby użytkownik końcowy mógł ją zrozumieć. W folderze zasobów / szablonów utwórz plik error.html i dodaj zależności w pliku pom.xml

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Spring automatycznie wybierze stronę error.html jako domyślny szablon błędu. Uwaga: - Nie zapomnij zaktualizować projektu maven po dodaniu zależności.

Joginder Malik
źródło
3

Być może pojawia się błąd, tj

„Ta aplikacja nie ma wyraźnego mapowania dla błędu /, więc widzisz to jako rezerwę”.

Dzieje się tak, ponieważ nie skanuje on klas kontrolera i usług, które musisz określić w swojej klasie main () w ten sposób,

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
**@ComponentScan({"com.example.demo", "controller", "service"})**
public class SpringBootMvcExample1Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMvcExample1Application.class, args);
    }
}

Uwaga: tutaj określiłem różne klasy, takie jak demo, kontroler i usługa do przeskanowania, tylko wtedy będą działać poprawnie.

Rupesh Bharuka
źródło
3

Musisz zorganizować pakiety tak, aby pakiet zawierał public static main (lub tam, gdzie napisałeś @SpringBootApplication), ojca wszystkich innych pakietów.

sakgeek
źródło
- com.mypackage + nameApplication.java - com.mypachage.model - com.mypachage.controller - com.mypachage.dao
sakgeek
3

Domyślnie rozruch sprężynowy skanuje bieżący pakiet pod kątem definicji fasoli. Więc jeśli twój bieżący pakiet, w którym zdefiniowano główną klasę i pakiet kontrolera nie jest taki sam lub pakiet kontrolera nie jest pakietem podrzędnym twojego głównego pakietu aplikacji, nie będzie skanował kontrolera. Aby rozwiązać ten problem, można dołączyć listę pakietów do definicji fasoli w pakiecie głównym

@SpringBootApplication(scanBasePackages = {"com.module.restapi1.controller"})

lub utwórz hierarchię pakietu, w której pakiet potomny pochodzi z pakietu głównego

package com.module.restapi;
package com.module.restapi.controller
anand shukla
źródło
2

Problem polega na tym, że nawigujesz do localhost: 8080 / zamiast localhost: 8080 / upload, jak opisano w przewodniku. Spring Boot ma domyślną stronę błędu używaną podczas przechodzenia do niezdefiniowanej trasy, aby uniknąć ujawniania szczegółowych informacji o serwerze (które mogą być postrzegane jako zagrożenie bezpieczeństwa).

Masz opcje: odwiedź odpowiednią stronę, dodaj własną stronę docelową lub zastąp białą stronę błędu .

Aby uprościć tę konkretną sytuację, zaktualizowałem przewodnik tak, aby używał / zamiast / upload.

gregturn
źródło
2

Wiem, że to nie jest dokładnie odpowiedź na pytanie, ale to pytanie jest pierwsze, które pojawia się w Google :)

Problem („Ta aplikacja nie ma wyraźnego mapowania dla / błąd”) pojawia się podczas próby uzyskania dostępu do interfejsu użytkownika Swagger.

W moim przypadku problemy zostały spowodowane przez @RestController ("/ endpoint"), który nie jest obsługiwany poprawnie przez swagger.

To spowodowało błędy:

@RestController("/endpoint")
public class EndpointController {

I to było w porządku

@RestController
@RequestMapping("/endpoint")
public class EndpointController {
Elas
źródło
2

może się to zdarzyć, jeśli zapomnisz adnotacji @RestController na górze klasy kontrolera import import org.springframework.web.bind.annotation.RestController;

i dodaj adnotację jak poniżej

zapoznaj się z prostym przykładem poniżej

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;


@RestController
public class HelloController {
@RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}
Sithija Piyuman Thewa Hettige
źródło
1

Zmień @Controller na @RestController w swojej klasie kontrolera i wszystko powinno pójść gładko.

supernowa
źródło
1

Ja również dostałem ten sam błąd i mogłem go rozwiązać, dodając poniższą zależność do mojego pom.xml.

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

Powodem jest to, że używamy JSP jako widoku. Domyślny wbudowany kontener serwletów dla Spring Boot Starter Web to tomcat. Aby włączyć obsługę stron JSP, musielibyśmy dodać zależność od tomcat-embed-jasper.

W moim przypadku zwracałem JSP jako widok z kontrolera. Mam nadzieję, że ta odpowiedź pomoże komuś, kto boryka się z tym samym problemem.

Sujana
źródło
1

Miałem ten sam problem, używając gradle i został rozwiązany przez dodanie następujących zależności:

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
compile('org.apache.tomcat.embed:tomcat-embed-jasper')

wcześniej brakowało mi ostatniego powodując ten sam błąd.

siddhartha attri
źródło
Miałem ten sam problem i brakowało mi wtyczki tomcat-embed-jasper w pom.xml. A tomcat-embed-jasper jest ważny do renderowania jsp.
rinilnath
boraji.com/… , to prowadzi do znalezienia zaginionego tomcat-embed-jasper
rinilnath
1

Miałem do czynienia z tym problemem, a później zdałem sobie sprawę, że brakuje mi @Configurationadnotacji w MvcConfigklasie, która w zasadzie wykonuje mapowanie dla ViewControllersi setViewNames.

Oto zawartość pliku:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
**@Configuration**
public class MvcConfig implements WebMvcConfigurer{
   public void addViewControllers(ViewControllerRegistry registry)
   {
      registry.addViewController("/").setViewName("login");
      registry.addViewController("/login").setViewName("login");
      registry.addViewController("/dashboard").setViewName("dashboard");
   }
}

Mam nadzieję, że to komuś pomoże!

Arupesh RoyChowdhury
źródło
Zrobiło to dla mnie.
Anthony Okoth,
1

Upewnij się, że na liście zależności masz jasper i jstl:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

Oto działający projekt startowy - https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

Autor: Biju Kunjummen

Yersin
źródło
1

Muszę o tym wspomnieć i podać odniesienie do pakietów i udało się. Możesz wykluczyć @EnableAutoConfigurationtę adnotację, ale wymagane jest, aby ominąć wszelkie zależności związane z DB.

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@ComponentScan(basePackages = {"your package 1", "your package2"})

public class CommentStoreApplication {

    public static void main(String[] args) {
        SpringApplication.run(CommentStoreApplication.class, args);

    }
}
mannedear
źródło
1

Klasa główna musi znajdować się poza strukturą drzewa pakietów aplikacji. Na przykład: przykład

Paulo Berezini
źródło
0

Wszystko, co zrobiłem, aby rozwiązać tego rodzaju problem, to wspomnieć o anotacji @Configuration w klasie MVCConfig.

Jak ten :

package com.example;

/**
 * Created by sartika.s.hasibuan on 1/10/2017.
 */
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}
Sartika Hasibuan
źródło
0

Miałem podobny błąd, używam rozruchu sprężyny i prędkości, moim rozwiązaniem jest sprawdzenie pliku application.properties, spring.velocity.toolbox-config-location i okazało się, że ta właściwość jest nieprawidłowa

叶 为 正
źródło
0

W moim przypadku ten problem występuje podczas uruchamiania SpringApplication z poziomu IntelliJ po pierwszym uruchomieniu go z maven.

Aby rozwiązać problem, biegnę pierwszy mvn clean. Następnie uruchamiam SpringApplication z poziomu IntelliJ.

Mert Nuhoglu
źródło
0

Upewnij się, że plik Main. klasa powinna znajdować się na górze kontrolerów. W przypadku poniższego przykładu:

Main.class zawiera:

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

EmployeeController. klasa zawierająca:

@RestController
public class EmployeeController {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id");
    }

    @RequestMapping(value = "/employee/save", method = RequestMethod.GET)
    public String save(){
        Employee newEmp = new Employee();
        newEmp.setAge(25);
        newEmp.setFirstName("Pikachu");
        newEmp.setId(100);
        return "Name: " + newEmp.getFirstName() + ", Age: " + newEmp.getAge() + ", Id = " + newEmp.getId();
    }
}

Jeśli twoja główna klasa znajduje się w folderze głównym, tak jak ta ścieżka: {nazwa projektu} / src / main / java / main, upewnij się, że kontrolery są poniżej klasy głównej. Na przykład {projectname} / src / main / java / main / controllers .

Abed G.
źródło
0

W swoim pliku java (powiedzmy: Viper.java) z główną klasą dodaj: „@RestController” i @RequestMapping („/”)

@SpringBootApplication
@RestController
public class Viper {

  @RequestMapping("/")

   public String home(){
          return "This is what i was looking for";                      
     }

public static void main( String[] args){

   SpringApplication.run(Viper.class , args);
}

}
Mayur Chavan
źródło
0

Sprawdź, czy oznaczyłeś klasę kontrolera adnotacją @RestController .

Karthik Kamath
źródło