स्प्रिंग बूट निकालें श्वेतसूची त्रुटि पृष्ठ


156

मैं व्हाइट लेबल त्रुटि पृष्ठ को हटाने का प्रयास कर रहा हूं, इसलिए मैंने जो किया है वह "/ त्रुटि" के लिए नियंत्रक मानचित्रण बनाया गया था,

@RestController
public class IndexController {

    @RequestMapping(value = "/error")
    public String error() {
        return "Error handling";
    }

}

लेकिन अब मुझे यह त्रुटि हो रही है।

Exception in thread "AWT-EventQueue-0" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource   [org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration.class]: Invocation  of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'basicErrorController' bean method 
public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>>  org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletR equest)
to {[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'indexController' bean method

पता नहीं मैं कुछ गलत कर रहा हूँ या नहीं। कृपया सलाह दें।

संपादित करें:

पहले से ही error.whitelabel.enabled=false application.properties फ़ाइल में जोड़ा गया, अभी भी वही त्रुटि हो रही है


1
इस परियोजना को देखें github.com/paulc4/mvc-exception/blob/master/src/main/java/… , लगता है कि उनके पास त्रुटि पृष्ठ पुनरावृत्ति है।
Innot Kauker

क्या आपने सेटिंग करने की कोशिश की है spring.resources.add-mappings=false?
जियोन्ड

सुझाव के लिए धन्यवाद, हां अभी भी वही त्रुटि मिली है
यासिथा वाड्यूज

क्या आप /errorपथ कहे जाने पर कुछ कस्टम सामग्री वापस करने का प्रयास कर रहे हैं ?
जियोन्ड

जवाबों:


240

आपको अपना कोड निम्नलिखित में बदलना होगा:

@RestController
public class IndexController implements ErrorController{

    private static final String PATH = "/error";

    @RequestMapping(value = PATH)
    public String error() {
        return "Error handling";
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}

आपके कोड ने काम नहीं किया, क्योंकि स्प्रिंग बूट स्वचालित BasicErrorControllerरूप से स्प्रिंग बीन के रूप में पंजीकृत हो जाता है जब आपने इसका कार्यान्वयन निर्दिष्ट नहीं किया होता है ErrorController

उस तथ्य को देखने के लिए बस नेविगेट करें ErrorMvcAutoConfiguration.basicErrorController यहां करें


1
एक ही मुद्दे में एक ही भाग में, मैंने स्प्रिंग डॉक्स की खोज की लेकिन इसमें BasicErrorController का उल्लेख नहीं किया। यह काम करता है :)
माइक आर

4
मुझे इस एक को खोजने के लिए स्रोत से होकर गुजरना पड़ा :-)
geoand

1
धन्यवाद, अच्छी तरह से काम किया! एक छोटा सा अनुवर्ती यदि आप कोई संकेत दे सकते हैं: मान लें कि हम इस त्रुटि हैंडलर में मिलते हैं क्योंकि कुछ अपवाद हमारे ऐप में डाले गए थे (और स्प्रिंग निहितार्थ प्रतिक्रिया कोड को 500 पर सेट करता है जो सही है); क्या उस अपवाद को पकड़ने का एक आसान तरीका है यहां (त्रुटि संदेश में कुछ विवरण शामिल करने के लिए)?
जोनिक

1
खुशी हुई कि यह आपको उपयोगी लगा! हालाँकि मैंने इसकी कोशिश नहीं की है, लेकिन मुझे पूरा यकीन है कि आप स्प्रिंग बूट में पाए गए सिद्धांतों का उपयोग कर सकते हैं BasicErrorController(देखें github.com/spring-projects/spring-boot/blob/… ) जो आप चाहते हैं उसे पूरा करने के लिए
जियो

3
हम्म, हाँ, धन्यवाद फिर से! पहले तो मुझे यकीन नहीं था कि उस ErrorAttributesवस्तु को कैसे प्राप्त किया जा सकता है (त्रुटि विवरण युक्त), लेकिन फिर मैंने इसे @ बस करने की कोशिश की, और यह काम करता है। क्या मैं अब के लिए साथ चला गया: gist.github.com/jonikarppinen/662c38fb57a23de61c8b
Jonik

44

यदि आप एक और "JSONish" प्रतिक्रिया पृष्ठ चाहते हैं तो आप कुछ इस तरह की कोशिश कर सकते हैं:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;

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

@RestController
@RequestMapping("/error")
public class SimpleErrorController implements ErrorController {

  private final ErrorAttributes errorAttributes;

  @Autowired
  public SimpleErrorController(ErrorAttributes errorAttributes) {
    Assert.notNull(errorAttributes, "ErrorAttributes must not be null");
    this.errorAttributes = errorAttributes;
  }

  @Override
  public String getErrorPath() {
    return "/error";
  }

  @RequestMapping
  public Map<String, Object> error(HttpServletRequest aRequest){
     Map<String, Object> body = getErrorAttributes(aRequest,getTraceParameter(aRequest));
     String trace = (String) body.get("trace");
     if(trace != null){
       String[] lines = trace.split("\n\t");
       body.put("trace", lines);
     }
     return body;
  }

  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 aRequest, boolean includeStackTrace) {
    RequestAttributes requestAttributes = new ServletRequestAttributes(aRequest);
    return errorAttributes.getErrorAttributes(requestAttributes, includeStackTrace);
  }
}

7
स्प्रिंग-बूट v2 में ErrorController और ErrorAttributes कक्षाएं पैकेज में हैं। org.springframework.boot.web.servlet.error और आगे ErrorAttributes # getErrorArributeses विधि हस्ताक्षर बदल गए हैं, कृपया स्प्रिंग-बूट v1 पर निर्भरता नोट करें और संभवतः v2 के लिए संकेत दें। धन्यवाद।
क्रिसिनमटाउन

1
परिवर्तन: निजी मानचित्र <स्ट्रिंग, ऑब्जेक्ट> getErrorAttributes (HttpServletRequest aRequest, बूलियन शामिलStackTrace) {RequestAttributes requestAttributes = new ServRRequestAttributes (aRequest); वापसी errorAttributes.getErrorAttributes (requestAttributes, includeStackTrace); } द्वारा: निजी मानचित्र <स्ट्रिंग, ऑब्जेक्ट> getErrorAttributes (HttpServletRequest अनुरोध, बूलियन शामिलStackTrace) {WebRequest webRequest = new ServletWebRestest (अनुरोध); यह लौटाएँ ।errorAttributes.getErrorAttributes (webRequest, शामिलस्टैकट्रेस); }
रीजा रामप्यिंद्र

2
ऊपर की टिप्पणियों पर विचार करते हुए SimpleErrorController.java का अपडेटेड संस्करण यहां पाया जा सकता है> gist.github.com/oscarnevarezleal/…
ऑस्कर

38

स्प्रिंग बूट डॉक 'गलत था (उन्होंने इसे ठीक कर दिया है):

इसे बंद करने के लिए आप error.whitelabel.enabled = false सेट कर सकते हैं

होना चाहिए

इसे बंद करने के लिए आप server.error.whitelabel.enabled = false सेट कर सकते हैं


यह व्हाइट लेबल त्रुटि पेज को अक्षम कर देगा लेकिन स्प्रिंग बूट /errorवैसे भी समापन बिंदु को मैप करेगा । समापन बिंदु /errorसेट server.error.path=/error-springया कुछ वैकल्पिक पथ को मुक्त करने के लिए ।
नोट्स-जेज

32

आप इसे निर्दिष्ट करके पूरी तरह से हटा सकते हैं:

import org.springframework.context.annotation.Configuration;
import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
...
@Configuration
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
public static MainApp { ... }

हालाँकि, ध्यान दें कि ऐसा करने से संभवतः सर्वलेट कंटेनर के श्वेतसूची पृष्ठों को दिखाने के बजाय हो जाएगा :)


संपादित करें: ऐसा करने का एक और तरीका application.yaml है। बस मूल्य में डाल:

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration

प्रलेखन

स्प्रिंग बूट <2.0 के लिए, क्लास पैकेज में स्थित है org.springframework.boot.autoconfigure.web


15

यहां मैनुअल कहता है कि आपको मानक त्रुटि पृष्ठ को अक्षम server.error.whitelabel.enabledकरने के falseलिए सेट करना होगा। शायद यह वही है जो आप चाहते हैं?

जिस तरह से / त्रुटि मैपिंग जोड़ने के बाद मैं उसी त्रुटि का सामना कर रहा हूं।


हां, मैंने पहले ही त्रुटि सेट कर दी है ।whitelabel.enabled = false लेकिन अभी भी जोड़ने / त्रुटि मैपिंग के बाद एक ही त्रुटि मिल रही है
यासिथा वाड्यूज

यह व्हाइट लेबल त्रुटि पेज को अक्षम कर देगा लेकिन स्प्रिंग बूट /errorवैसे भी समापन बिंदु को मैप करेगा । समापन बिंदु /errorसेट server.error.path=/error-springया कुछ वैकल्पिक पथ को मुक्त करने के लिए ।
नोट्स-जेज

11

स्प्रिंग बूट> 1.4.x के साथ आप ऐसा कर सकते हैं:

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

लेकिन फिर अपवाद के मामले में सर्वलेट कंटेनर अपना त्रुटि पृष्ठ प्रदर्शित करेगा।


8

यह आपके स्प्रिंग बूट संस्करण पर निर्भर करता है:

जब SpringBootVersion <= 1.2तब उपयोग करेंerror.whitelabel.enabled = false

जब SpringBootVersion > = 1.3तब उपयोग करेंserver.error.whitelabel.enabled = false


6

स्प्रिंग बूट 1.4.1 में मूंछें टेम्प्लेट का उपयोग करके, टेम्पलेट फोल्डर के अंतर्गत एरर.html रखना काफी होगा:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>Error</title>
</head>

<body>
  <h1>Error {{ status }}</h1>
  <p>{{ error }}</p>
  <p>{{ message }}</p>
  <p>{{ path }}</p>
</body>

</html>

के लिए एक इंटरसेप्टर बनाकर अतिरिक्त चर पास किए जा सकते हैं /error


इस उदाहरण का उपयोग करना: github.com/paulc4/mvc-exception/blob/master/src/main/resources/…
e-info128

3

यहां एक वैकल्पिक विधि है जो त्रुटि मैपिंग को निर्दिष्ट करने के "पुराने तरीके" के समान है web.xml

बस इसे अपने स्प्रिंग बूट कॉन्फ़िगरेशन में जोड़ें:

@SpringBootApplication
public class Application implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {

    @Override
    public void customize(ConfigurableServletWebServerFactory factory) {
        factory.addErrorPages(new ErrorPage(HttpStatus.FORBIDDEN, "/errors/403.html"));
        factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/errors/404.html"));
        factory.addErrorPages(new ErrorPage("/errors/500.html"));
    }

}

फिर आप सामान्य रूप से स्थैतिक सामग्री में त्रुटि पृष्ठों को परिभाषित कर सकते हैं।

@Componentयदि वांछित हो , तो कस्टमाइज़र एक अलग भी हो सकता है ।


3

मैं स्प्रिंग बूट संस्करण 2.1.2 का उपयोग कर रहा हूं और errorAttributes.getErrorAttributes()हस्ताक्षर ने मेरे लिए काम नहीं किया (एकॉन की प्रतिक्रिया में)। मैं एक JSON प्रकार प्रतिक्रिया चाहता था, इसलिए मैंने थोड़ी खुदाई की और पाया कि यह विधि ठीक वही है जो मुझे चाहिए था।

मुझे अपनी अधिकांश जानकारी इस थ्रेड के साथ-साथ इस ब्लॉग पोस्ट से भी मिली ।

सबसे पहले, मैंने बनाया CustomErrorControllerकि स्प्रिंग किसी भी त्रुटि को मैप करने के लिए देखेगा।

package com.example.error;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.WebRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@RestController
public class CustomErrorController implements ErrorController {

    private static final String PATH = "error";

    @Value("${debug}")
    private boolean debug;

    @Autowired
    private ErrorAttributes errorAttributes;

    @RequestMapping(PATH)
    @ResponseBody
    public CustomHttpErrorResponse error(WebRequest request, HttpServletResponse response) {
        return new CustomHttpErrorResponse(response.getStatus(), getErrorAttributes(request));
    }

    public void setErrorAttributes(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }

    private Map<String, Object> getErrorAttributes(WebRequest request) {
        Map<String, Object> map = new HashMap<>();
        map.putAll(this.errorAttributes.getErrorAttributes(request, this.debug));
        return map;
    }
}

दूसरा, मैंने CustomHttpErrorResponseJSON के रूप में त्रुटि वापस करने के लिए एक वर्ग बनाया ।

package com.example.error;

import java.util.Map;

public class CustomHttpErrorResponse {

    private Integer status;
    private String path;
    private String errorMessage;
    private String timeStamp;
    private String trace;

    public CustomHttpErrorResponse(int status, Map<String, Object> errorAttributes) {
        this.setStatus(status);
        this.setPath((String) errorAttributes.get("path"));
        this.setErrorMessage((String) errorAttributes.get("message"));
        this.setTimeStamp(errorAttributes.get("timestamp").toString());
        this.setTrace((String) errorAttributes.get("trace"));
    }

    // getters and setters
}

अंत में, मुझे application.propertiesफाइल में व्हिटेलबेल को बंद करना पड़ा ।

server.error.whitelabel.enabled=false

यह भी xmlअनुरोधों / प्रतिक्रियाओं के लिए काम करना चाहिए । लेकिन मैंने उसका परीक्षण नहीं किया है। यह वही था जो मैं देख रहा था क्योंकि मैं एक RESTful API बना रहा था और केवल JSON को वापस करना चाहता था।


2

server.error.whitelabel.enabled = false

संसाधन फ़ोल्डर application.properties को उपरोक्त लाइन शामिल करें

अधिक त्रुटि मुद्दा हल कृपया http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page देखें


मैंने अपने स्थापना फ़ोल्डर में application.properties की कोशिश की जिसमें कुछ भी नहीं था। / Src / main / resource के तहत application.properties फ़ोल्डर सुजानिया सुदर्शन को व्यक्त करने का प्रयास कर रहा था। यह ग्रहण में एक "हॉट रीड" भी प्रतीत होता है।
रिचर्ड ब्रैडली स्मिथ

1

मैं एक microservice से REST एंडपॉइंट कॉल करने की कोशिश कर रहा था और मैं रेस्टेमप्लेट की पुट विधि का उपयोग कर रहा था ।

मेरे डिजाइन में अगर REST एंडपॉइंट के अंदर कोई त्रुटि हुई है, तो उसे JSON त्रुटि प्रतिक्रिया वापस करनी चाहिए, यह कुछ कॉल के लिए काम कर रहा था, लेकिन इसके लिए एक नहीं डाला गया, इसने व्हाइट लेबल त्रुटि पृष्ठ लौटा दिया के बजाय।

इसलिए मैंने कुछ जांच की और मुझे पता चला कि;

स्प्रिंग कॉलर को समझने की कोशिश करता है कि क्या यह एक मशीन है तो यह JSON प्रतिक्रिया देता है या यदि यह एक ब्राउज़र है तो यह व्हाइट लेबल संदेश पृष्ठ लौटाता है एचटीएमएल ।

परिणामस्वरूप: मेरे क्लाइंट ऐप को REST के समापन बिंदु पर यह कहने की आवश्यकता है कि कॉलर एक मशीन है, न कि कोई ब्राउज़र इसलिए इसके लिए क्लाइंट ऐप को ' एप्लिकेशन / json जोड़ने की आवश्यकता है को ACCEPT हेडर में ' लिए स्पष्ट रूप से resttemplate की 'put' पद्धति के लिए आवश्यक है। मैंने इसे हेडर में जोड़ा और समस्या को हल किया।

अंतिम बिंदु पर मेरा कॉल:

restTemplate.put(url, request, param1, param2);

उपरोक्त कॉल के लिए मुझे हेडर परम से नीचे जोड़ना होगा।

headers.set("Accept", MediaType.APPLICATION_JSON_UTF8_VALUE);

या मैंने पुट को एक्सचेंज में बदलने की कोशिश की, इस मामले में, एक्सचेंज कॉल ने मेरे लिए एक ही हेडर जोड़ा और समस्या को भी हल कर दिया, लेकिन मुझे पता नहीं क्यों :)

restTemplate.exchange(....)

0

डिफ़ॉल्ट रूप से स्प्रिंग बूट में एक " व्हाइटेलबेल " त्रुटि पृष्ठ होता है जिसे आप सर्वर में त्रुटि होने पर ब्राउज़र में देख सकते हैं। व्हिटेलबेल एरर पेज एक जेनेरिक स्प्रिंग बूट एरर पेज है, जो कस्टम त्रुटि पेज नहीं मिलने पर प्रदर्शित होता है।

डिफ़ॉल्ट त्रुटि पृष्ठ के स्विच के लिए "server.error.whitelabel.enabled = false" सेट करें


0

जब भी मैंने रिफ्रेश किया, मुझे अपने एंगुलर एसपीए पर इसी तरह का मुद्दा व्हाइटलैब त्रुटि संदेश मिला।

फिक्स एक नियंत्रक बनाने के लिए था, जो कि ErrorController को लागू करता है, लेकिन एक स्ट्रिंग को वापस करने के बजाय, मुझे एक ModelAndView ऑब्जेक्ट वापस करना होगा जो कि आगे /

@CrossOrigin
@RestController
public class IndexController implements ErrorController {
    
    private static final String PATH = "/error";
    
    @RequestMapping(value = PATH)
    public ModelAndView saveLeadQuery() {           
        return new ModelAndView("forward:/");
    }

    @Override
    public String getErrorPath() {
        return PATH;
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.