แอปพลิเคชันนี้ไม่มีการแมป / error อย่างชัดเจน


110

ฉันใช้ maven เพื่อทำบทช่วยสอนhttps://spring.io/guides/gs/uploading-files/
รหัสทั้งหมดที่ฉันใช้ถูกคัดลอก

แอปพลิเคชันสามารถทำงานได้ แต่ฉันได้รับข้อผิดพลาด:

หน้าข้อผิดพลาด Whitelabel แอปพลิเคชันนี้ไม่มีการแมป / error อย่างชัดเจนดังนั้นคุณจึงเห็นสิ่งนี้เป็นทางเลือก อ. 30 มิ.ย. 17:24:02 น. CST 2015 เกิดข้อผิดพลาดที่ไม่คาดคิด (type = Not Found, status = 404) ไม่มีข้อความ

จะแก้ไขได้อย่างไร?


เพิ่มความคิดเห็นของคุณในโพสต์ - คุณสามารถแก้ไขได้ด้วยตัวเอง ดีกว่าการแสดงความคิดเห็นในโพสต์ของคุณเอง
Alexander

คำตอบ:


139

ตรวจสอบให้แน่ใจว่าคลาสหลักของคุณอยู่ในแพ็กเกจรูทเหนือคลาสอื่น ๆ

เมื่อคุณเรียกใช้ Spring Boot Application (เช่นคลาสที่มีคำอธิบายประกอบด้วย @SpringBootApplication) Spring จะสแกนเฉพาะคลาสที่อยู่ด้านล่างแพ็กเกจคลาสหลักของคุณ

com
   +- APP
         +- Application.java  <--- your main class should be here, above your controller classes
         |
         +- model
         |   +- user.java
         +- controller
             +- UserController.java

4
สูงกว่าหรือระดับเดียวกัน?
Martin Erlic

21
ฉันใช้เวลาเกือบ 2 ชั่วโมงในชีวิตเพื่อหาสิ่งนี้!
Rakesh

7
พยายามเช่นกัน ยังคงมีข้อผิดพลาด อย่างน้อยหน้าหลักเช่นlocalhost: 8080ควรแสดงหน้าแรกของ Tomcat ให้ฉันเห็นไหม? แต่นั่นก็ไม่ปรากฏเช่นกัน
zulkarnain shah

ขอบคุณสำหรับคำแนะนำ ฉันเคยเป็นผู้ใช้ Eclipse และไม่จำเป็นต้องมีการกำหนดค่านี้ แต่ตอนนี้ฉันใช้ IntelliJ และมีความหวังมาก
Armer B.

@zulkarnainshah โฮมเพจ tomcat ตามปกติถูกสร้างขึ้นโดย WAR ที่ไม่รวมอยู่ที่นี่
Thorbjørn Ravn Andersen

63

เมื่อเราสร้างแอปพลิเคชัน Spring boot เราจะใส่คำอธิบายประกอบด้วย@SpringBootApplicationคำอธิบายประกอบ คำอธิบายประกอบนี้ 'รวม' คำอธิบายประกอบที่จำเป็นอื่น ๆ อีกมากมายเพื่อให้แอปพลิเคชันทำงานได้ คำอธิบายประกอบอย่างหนึ่งคือ@ComponentScanคำอธิบายประกอบ คำอธิบายประกอบนี้บอกให้ Spring มองหาส่วนประกอบของ Spring และกำหนดค่าให้แอปพลิเคชันทำงาน

คลาสแอปพลิเคชันของคุณต้องอยู่บนสุดของลำดับชั้นแพ็กเกจของคุณเพื่อให้ Spring สามารถสแกนแพ็กเกจย่อยและค้นหาส่วนประกอบที่จำเป็นอื่น ๆ

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);
    }
}

ด้านล่างข้อมูลโค้ดทำงานได้เนื่องจากแพ็คเกจคอนโทรลเลอร์อยู่ภายใต้com.test.spring.bootแพ็คเกจ

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!";
    }
}

ข้อมูลโค้ดด้านล่าง ไม่ทำงานเนื่องจากแพ็คเกจคอนโทรลเลอร์ไม่อยู่ในcom.test.spring.bootแพ็คเกจ

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!";
     }
 }

จากเอกสาร Spring Boot:

นักพัฒนาฤดูใบไม้ผลิ Boot หลายคนมักจะมีระดับหลักของพวกเขากำกับ@Configuration, และ@EnableAutoConfiguration @ComponentScanเนื่องจากคำอธิบายประกอบเหล่านี้มักใช้ร่วมกัน (โดยเฉพาะอย่างยิ่งหากคุณปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดข้างต้น) Spring Boot จึงเป็น@SpringBootApplicationทางเลือกที่สะดวก

@SpringBootApplicationคำอธิบายประกอบเทียบเท่ากับการใช้ @Configuration, @EnableAutoConfigurationและ@ComponentScanมีคุณลักษณะที่เริ่มต้นของพวกเขา


3
คำอธิบายที่ดีมาก ขอบคุณ
Lova Chittumuri

39

คุณสามารถแก้ปัญหานี้ได้โดยเพิ่มErrorControllerแอปพลิเคชันของคุณ คุณสามารถให้ตัวควบคุมข้อผิดพลาดส่งคืนมุมมองที่คุณต้องการได้

ตัวควบคุมข้อผิดพลาดในแอปพลิเคชันของฉันมีลักษณะดังนี้:

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;
    }
}

คลาสข้างต้นขึ้นอยู่กับคลาสSprings BasicErrorController

คุณสามารถสร้างอินสแตนซ์ด้านบนErrorControllerเช่นนี้ใน@Configurationไฟล์:

 @Autowired
 private ErrorAttributes errorAttributes;

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

คุณสามารถเลือกแทนที่ค่าเริ่มต้นErrorAttributesโดยการใช้ErrorAttributes แต่ในกรณีส่วนใหญ่DefaultErrorAttributesควรจะเพียงพอ


1
ลิงก์ของคุณไปยังBasicErrorControllerคลาส 404
Stephane

@owaism: ลิงก์สำหรับBasicErrorControllerไม่ดีอีกต่อไปคุณสามารถอัปเดตได้หรือไม่?
HDJEMAI

1
ลิงก์ไปยังBasicErrorControllerได้รับการแก้ไขแล้ว
สัจพจน์

15

ในกรณีของฉันคลาสคอนโทรลเลอร์มีคำอธิบายประกอบด้วย@Controller. การเปลี่ยนเพื่อ@RestControllerแก้ไขปัญหา โดยทั่วไป@RestControllerจะ@Controller + @ResponseBody ใช้@RestControllerหรือ@Controllerมี@ResponseBodyคำอธิบายประกอบกับแต่ละวิธี

หมายเหตุที่เป็นประโยชน์บางส่วนที่นี่: https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/


มันใช้งานได้ แต่ตามตัวอย่างการกำหนดค่าพื้นฐานทางอินเทอร์เน็ตควรทำงานกับ @Controller ร่างกายใด ๆ ที่ตระหนักถึงเหตุผลนี้ว่าทำไม RestController เท่านั้นที่ทำงาน?
supernova

เมื่อใส่คำอธิบายประกอบในชั้นเรียนของคุณ@RestControllerจะเพิ่ม@ResponseBodyคำอธิบายประกอบโดยปริยายแต่ถ้าคุณใช้@Controllerคำอธิบายประกอบคุณต้องเพิ่มคำอธิบายประกอบนี้ด้วยตัวเองอย่างชัดเจน
Robin Keskisarkka

10

ในกรณีของฉันเป็นเพราะตำแหน่งแพ็คเกจหมายความว่าแพ็คเกจของคอนโทรลเลอร์ต้องอยู่เหนือแพ็คเกจคลาสหลัก

หากแพ็คเกจคลาสหลักของฉันเป็นแพ็คเกจpackage co.companyname.spring.tutorial;คอนโทรลเลอร์ใด ๆ ที่ควรpackage 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"; 
 }}

หลังจากเสร็จสิ้นการเข้ารหัสกดบูตแดชบอร์ด

ป้อนคำอธิบายภาพที่นี่

สิ่งสุดท้ายที่จะทำให้แน่ใจว่าคอนโทรลเลอร์ของคุณกำลังทำแผนที่หรือไม่ใช่แค่คอนโซลคุณควรเห็น smilliar บางอย่าง

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

มีความสุขในการเข้ารหัส


9

ลองเพิ่มการอ้างอิง

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

2
สิ่งนี้ทำอะไรได้จริง?
ชิงทรัพย์รับบี

ฉันเพิ่มการพึ่งพานี้และใช้งานได้ เช่นเดียวกับ @StealthRabbi ... ฉันยังสงสัยว่ามันทำอะไรได้จริง
twindham

@StealthRabbi สิ่งนี้เพิ่มการพึ่งพาให้กับเฟรมเวิร์กเทมเพลตที่เรียกว่า Thymeleaf ซึ่งเป็นทางเลือกและแนวทางที่ต้องการสำหรับ JSP คำตอบนี้ไม่ใช่คำตอบที่แท้จริง imo การทิ้งการพึ่งพาไม่ได้ช่วยใครที่สนใจประเด็นหลักอย่างแท้จริง
Christian

9

เหตุการณ์นี้เกิดขึ้นเมื่อไม่ได้กำหนดหน้าข้อผิดพลาดอย่างชัดเจน ในการกำหนดเพจข้อผิดพลาดให้สร้างการแมป / error ด้วยมุมมอง เช่นโค้ดด้านล่างแมปกับค่าสตริงที่ถูกส่งกลับในกรณีที่เกิดข้อผิดพลาด

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";
    }

}

คุณช่วยเพิ่มคำอธิบายให้กับโค้ดของคุณได้ไหม เหตุใดจึงช่วยแก้คำถามซึ่งเป็นส่วนสำคัญ
Nico Haase

มีสิ่งหนึ่งที่ควรทราบในคำตอบนี้เมื่อเทียบกับ Spring Boot ที่ทำให้ฉันปวดหัวเล็กน้อยในตอนแรก การติดตั้งอินเทอร์เฟซ ErrorController ของ springframework เป็นสิ่งสำคัญ หากคุณสร้างจุดสิ้นสุดของคอนโทรลเลอร์ที่แมปกับ "/ error" โดยไม่ทำเช่นนี้คุณจะได้รับข้อผิดพลาดที่แจ้งให้คุณทราบว่ามีการแมปเมธอดนั้นแล้ว
mmaynar1

5

ฉันเพิ่มการอ้างอิงนี้และช่วยแก้ปัญหาของฉันได้

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

    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

นี่คือทฤษฎีของฉัน: ถ้าเราใช้ "@Controller" อย่างใด Spring ก็ต้องการให้เรามีเครื่องมือแม่แบบบางอย่าง และในกรณีนี้ Thymeleaf ดังนั้นจึงจำเป็นต้องมีสปริงบูตสตาร์ทเตอร์ - ไทม์ลีฟ ในขณะที่ถ้าเราใช้ "@RestController" Spring Boot ก็ไม่ต้องใช้เอ็นจิ้นเทมเพลต ดังนั้นมันจึงทำงานได้โดยไม่ต้องมีไทม์ลีฟ
โยสีปรามาจายา

4

ฉันกำลังพัฒนาแอปพลิเคชั่น Spring Boot อยู่สองสามสัปดาห์ .. และฉันได้รับข้อผิดพลาดเดียวกันดังต่อไปนี้

หน้าข้อผิดพลาด Whitelabel แอปพลิเคชันนี้ไม่มีการแมป / error อย่างชัดเจนดังนั้นคุณจึงเห็นสิ่งนี้เป็นทางเลือก พฤ 18 ม.ค. 14:12:11 AST 2018 เกิดข้อผิดพลาดที่ไม่คาดคิด (type = Not Found, status = 404) ไม่มีข้อความ

เมื่อฉันได้รับการนวดข้อผิดพลาดนี้ฉันตระหนักว่าคลาสคอนโทรลเลอร์หรือตัวควบคุมส่วนที่เหลือของฉันถูกกำหนดไว้ในโครงการของฉัน ฉันหมายถึงแพ็คเกจคอนโทรลเลอร์ทั้งหมดของเราไม่ใช่แพ็คเกจเดียวกันกับคลาสหลักซึ่งมีคำอธิบายประกอบ @SpringBootApplication ..ฉันหมายความว่าคุณต้องเพิ่มชื่อแพ็คเกจคอนโทรลเลอร์ของคุณเป็นคำอธิบายประกอบ @ComponentScan ในคลาสหลักของคุณซึ่งรวมอยู่ในคำอธิบายประกอบ @SpringBootApplication หากคุณเขียนโค้ด ด้านล่างปัญหาของคุณจะได้รับการแก้ไข ... สิ่งที่สำคัญที่สุดคือคุณต้องเพิ่มแพ็คเกจของคอนโทรลเลอร์ทั้งหมดของคุณลงในคำอธิบายประกอบ @ComponentScan เหมือนที่ฉันทำในด้านล่าง

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);
    }
}

ฉันหวังว่ารหัสนี้จะช่วยใครสักคน ...

หากคุณพบวิธีอื่นในการแก้ไขข้อผิดพลาดนี้หรือคุณมีข้อเสนอแนะสำหรับฉันโปรดเขียนความคิดเห็น ... ขอบคุณ ...


4

ในคลาสหลักหลังจากการกำหนดค่า "@SpringBootApplication" เพิ่ม "@ComponentScan" โดยไม่มีข้อโต้แย้งใด ๆ ได้ผลสำหรับฉัน !!!

ชั้นหลัก:

@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {

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

    }
}

คลาส RestController:

@RestController
public class CommentStoreApp {

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

PS: อย่าพลาดที่จะเรียกใช้คำสั่ง mvn clean และ mvn install ก่อนเปิดแอปพลิเคชัน


4

ค่อนข้างสายไปงานปาร์ตี้ ตามเอกสารอย่างเป็นทางการของฤดูใบไม้ผลิ "Spring Boot จะติดตั้งหน้าข้อผิดพลาดป้ายกำกับพิเศษที่คุณเห็นในไคลเอนต์เบราว์เซอร์หากคุณพบข้อผิดพลาดของเซิร์ฟเวอร์" https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page

  1. คุณสามารถปิดใช้งานคุณลักษณะโดยการตั้งค่าserver.error.whitelabel.enabled=falseในapplication.ymlหรือapplication.propertiesไฟล์

2. วิธีที่แนะนำคือตั้งค่าหน้าข้อผิดพลาดของคุณเพื่อให้ผู้ใช้สามารถเข้าใจได้ ภายใต้โฟลเดอร์resource / template ให้สร้างไฟล์error.htmlและเพิ่มการอ้างอิงในไฟล์ pom.xml

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

Spring จะเลือกหน้า error.html โดยอัตโนมัติเป็นเทมเพลตข้อผิดพลาดเริ่มต้น หมายเหตุ: - อย่าลืมอัปเดตโครงการ maven หลังจากเพิ่มการอ้างอิง


3

คุณอาจได้รับข้อผิดพลาดเช่น

"แอปพลิเคชันนี้ไม่มีการจับคู่ / ข้อผิดพลาดอย่างชัดเจนดังนั้นคุณจึงเห็นสิ่งนี้เป็นทางเลือก"

เนื่องจากไม่ได้สแกนคลาส Controller & Service ของคุณซึ่งคุณต้องระบุในคลาส main () ของคุณเช่นนี้

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);
    }
}

หมายเหตุ: ที่นี่ฉันได้ระบุคลาสต่างๆเช่นการสาธิตคอนโทรลเลอร์และบริการที่จะสแกนจากนั้นจะทำงานได้อย่างถูกต้องเท่านั้น


3

คุณต้องจัดระเบียบแพ็กเกจเพื่อให้แพ็กเกจมี public static main (หรือที่คุณเขียนว่า @SpringBootApplication) ซึ่งเป็นบิดาของแพ็กเกจอื่น ๆ ทั้งหมดของคุณ


- com.mypackage + nameApplication.java - com.mypachage.model - com.mypachage.controller - com.mypachage.dao
sakgeek

3

โดยค่าเริ่มต้นสปริงบูตจะสแกนแพ็กเกจปัจจุบันสำหรับคำจำกัดความของถั่ว ดังนั้นหากแพ็กเกจปัจจุบันของคุณที่กำหนดคลาสหลักและแพ็กเกจคอนโทรลเลอร์ไม่เหมือนกันหรือแพ็กเกจคอนโทรลเลอร์ไม่ใช่แพ็กเกจย่อยของแพ็กเกจแอพหลักของคุณแพ็กเกจจะไม่สแกนคอนโทรลเลอร์ ในการแก้ปัญหานี้เราสามารถรวมรายการแพ็คเกจสำหรับคำจำกัดความของถั่วในแพ็คเกจหลัก

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

หรือสร้างลำดับชั้นของแพ็กเกจที่แพ็กเกจลูกมาจากแพ็กเกจหลัก

package com.module.restapi;
package com.module.restapi.controller

2

ปัญหาคือคุณกำลังไปที่ localhost: 8080 / แทนที่จะเป็น localhost: 8080 / upload ตามที่กำหนดในคำแนะนำ Spring Boot มีหน้าข้อผิดพลาดเริ่มต้นที่ใช้เมื่อคุณนำทางไปยังเส้นทางที่ไม่ได้กำหนดเพื่อหลีกเลี่ยงการให้รายละเอียดเซิร์ฟเวอร์ (ซึ่งอาจถูกมองว่าเป็นความเสี่ยงด้านความปลอดภัย)

คุณเลือกกำลังเป็นอย่างใดอย่างหนึ่ง: เยี่ยมชมหน้าขวาเพิ่มหน้า Landing Page ของคุณเองหรือแทนที่หน้าข้อผิดพลาดสีขาว

เพื่อให้สถานการณ์นี้ง่ายขึ้นฉันได้อัปเดตคำแนะนำเพื่อให้ใช้ / แทน / อัปโหลด


2

ฉันรู้ว่ามันไม่ได้ตอบคำถามอย่างตรงไปตรงมา แต่คำถามนี้ปรากฏใน Google ก่อน :)

ปัญหา ("แอปพลิเคชันนี้ไม่มีการแมป / error อย่างชัดเจน") ปรากฏขึ้นเมื่อพยายามเข้าถึง Swagger UI

ในกรณีของฉันปัญหาเกิดจาก @RestController ("/ endpoint") ซึ่ง swagger ไม่ได้รับการจัดการอย่างเหมาะสม

ดังนั้นสิ่งนี้ทำให้เกิดข้อผิดพลาด:

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

และนี่ก็โอเค

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

2

สิ่งนี้สามารถเกิดขึ้นได้หากคุณลืมคำอธิบายประกอบ @RestController ที่ด้านบนของการนำเข้าคลาสคอนโทรลเลอร์ของคุณ org.springframework.web.bind.annotation.RestController;

และเพิ่มคำอธิบายประกอบด้านล่าง

ดูตัวอย่างง่ายๆด้านล่าง

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!";
    }

}


1

ฉันได้รับข้อผิดพลาดเดียวกันเช่นกันและสามารถแก้ไขข้อผิดพลาดได้โดยเพิ่มการอ้างอิงด้านล่างไปยัง pom.xml ของฉัน

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

เหตุผลคือเราใช้ JSP เป็นมุมมอง ค่าเริ่มต้นคอนเทนเนอร์ servlet ฝังตัวสำหรับ Spring Boot Starter Web คือ tomcat ในการเปิดใช้งานการสนับสนุนสำหรับ JSP เราจำเป็นต้องเพิ่มการพึ่งพา tomcat-embed-jasper

ในกรณีของฉันฉันส่งคืน JSP เป็นมุมมองจากคอนโทรลเลอร์ หวังว่าคำตอบนี้จะช่วยคนที่กำลังดิ้นรนกับปัญหาเดียวกัน


1

ฉันประสบปัญหาเดียวกันโดยใช้ gradle และได้รับการแก้ไขโดยการเพิ่มการอ้างอิงต่อไปนี้ -

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')

ก่อนหน้านี้ฉันพลาดคนสุดท้ายที่ทำให้เกิดข้อผิดพลาดเดียวกัน


ฉันมีปัญหาเดียวกันและฉันไม่มีปลั๊กอิน tomcat-embed-jasper ใน pom.xml และ tomcat-embed-jasper มีความสำคัญสำหรับการเรนเดอร์ jsp
รินนิลนาถ

boraji.com/…นี้พาไปพบว่า tomcat-embed-jasper หายไป
รินนิลนาถ

1

ฉันกำลังเผชิญปัญหานี้และหลังจากนั้นก็รู้ว่าผมก็หายไป@ConfigurationคำอธิบายประกอบในMvcConfigชั้นเรียนซึ่งโดยทั่วไปไม่แมปสำหรับและViewControllerssetViewNames

นี่คือเนื้อหาของไฟล์:

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");
   }
}

หวังว่านี่จะช่วยใครได้บ้าง !!


สิ่งนี้ทำเพื่อฉัน
Anthony

1

ตรวจสอบให้แน่ใจว่าคุณมี jasper และ 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>

นี่คือโครงการเริ่มต้นที่ใช้งานได้ - https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

ผู้แต่ง: Biju Kunjummen


1

ฉันต้องพูดถึงวิธีนี้และอ้างอิงถึงแพ็คเกจและมันได้ผล คุณสามารถยกเว้น@EnableAutoConfigurationคำอธิบายประกอบนี้ได้ แต่จำเป็นสำหรับฉันในการข้ามฐานข้อมูลที่เกี่ยวข้องกับฐานข้อมูล

@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);

    }
}

1

คลาสหลักต้องอยู่นอกโครงสร้างโครงสร้างแพ็กเกจแอปของคุณ ตัวอย่างเช่น: ตัวอย่าง


0

สิ่งที่ฉันได้ทำเพื่อแก้ปัญหาประเภทนี้คือการพูดถึง anotation @Configurationใน MVCConfig Class

เช่นนี้:

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");
    }

}

0

ฉันมีข้อผิดพลาดที่คล้ายกันฉันใช้สปริงบูตและความเร็ววิธีแก้ปัญหาของฉันคือตรวจสอบไฟล์ application.properties, spring.velocity.toolbox-config-location พบว่าคุณสมบัตินี้ไม่ถูกต้อง


0

ในกรณีของฉันปัญหานี้เกิดขึ้นเมื่อเรียกใช้ SpringApplication จากภายใน IntelliJ หลังจากรันครั้งแรกด้วย maven

mvn cleanเพื่อแก้ปัญหาผมใช้ครั้งแรก จากนั้นฉันเรียกใช้ SpringApplication จากภายใน IntelliJ


0

ตรวจสอบให้แน่ใจว่าหลักของคุณ ชั้นเรียนควรอยู่ด้านบนของคอนโทรลเลอร์ของคุณ ในกรณีดังตัวอย่างต่อไปนี้:

Main.class ที่มี:

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

พนักงานควบคุม คลาสที่มี:

@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();
    }
}

หากคลาสหลักของคุณอยู่ในโฟลเดอร์รูทเช่นเดียวกับเส้นทางนี้: {projectname} / src / main / java / mainจากนั้นตรวจสอบให้แน่ใจว่าคอนโทรลเลอร์ของคุณอยู่ต่ำกว่าคลาสหลักของคุณ ยกตัวอย่างเช่น{projectname} / src / main / java / ควบคุมหลัก /


0

ในไฟล์ java ของคุณ (พูดว่า: Viper.java) มีการเพิ่มคลาสหลัก: "@RestController" และ@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);
}

}

0

ตรวจสอบว่าคุณได้ทำเครื่องหมายคลาสคอนโทรลเลอร์ด้วยคำอธิบายประกอบ@RestControllerหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.