স্প্রিং বুট হোয়াইটলেবল ত্রুটি পৃষ্ঠা সরান


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/… , দেখে মনে হচ্ছে তাদের এতে রিম্যাপ করার ত্রুটি রয়েছে।
কৌকারকে

আপনি সেট করার চেষ্টা করেছেন 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
একই ইস্যুতে দৌড়ে, আমি স্প্রিং ডক্স অনুসন্ধান করেছি তবে এটি বেসিকআরররন্ট্রোলারের কথা উল্লেখ করে নি। এটি কাজ করে :)
মাইক আর

4
এটি খুঁজে পেতে আমাকে উত্সটি দিয়ে যেতে হয়েছিল :-)
জিওএন্ড

1
ধন্যবাদ, সুন্দরভাবে কাজ করেছেন! আপনি যদি কোনও পয়েন্টার দিতে পারেন তবে একটি ছোট্ট ফলোআপ: বলুন আমরা এই ত্রুটি হ্যান্ডলারটি পেয়েছি কারণ আমাদের অ্যাপে কিছু ব্যতিক্রম ছোঁড়া হয়েছিল (এবং স্প্রিং স্পষ্টভাবে প্রতিক্রিয়া কোডটি 500 এ সেট করে যা সঠিক); এখানে কি সেই ব্যতিক্রম ধরে রাখা সহজ উপায় আছে (ত্রুটি বার্তায় কিছু বিবরণ অন্তর্ভুক্ত করার জন্য)?
জোনিক

1
আপনি এটি দরকারী খুঁজে পেয়েছি খুশি! যদিও আমি এটি চেষ্টা করে দেখিনি, আমি নিশ্চিত যে আপনি স্প্রিং বুটের প্রাপ্ত নীতিগুলি ব্যবহার করতে পারেন BasicErrorController( github.com/spring-projects/spring-boot/blob/… দেখুন ) আপনি যা করতে চান তা করতে পারেন
জিওআন্ড

3
হুঁ, হ্যাঁ, আবারও ধন্যবাদ! প্রথমে আমি নিশ্চিত হয়ে উঠতে পারি না যে কীভাবে সেই ErrorAttributesবস্তুটি পাওয়া যাবে (ত্রুটির বিবরণ সহ) তবে আমি কেবল এটির চেষ্টা @ চেষ্টা করেছি, এবং এটি কার্যকর হয়। আমি আপাতত যা দিয়েছিলাম: gist.github.com/jonikarppinen/662c38fb57a23de61c8b
জোনিক

44

আপনি যদি আরও "জেএসোনিশ" প্রতিক্রিয়া পৃষ্ঠা চান তবে আপনি এরকম কিছু চেষ্টা করতে পারেন:

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
স্প্রিং-বুট ভি 2-তে ত্রুটি-নিয়ন্ত্রণকারী এবং ত্রুটিআর্ট্রিবিউট ক্লাসগুলি প্যাকেজে রয়েছে org.springframework.boot.web.servlet.error এবং আরও ত্রুটিঅ্যাট্রিবিউট # getErrorAttributes পদ্ধতি স্বাক্ষর বদলেছে, দয়া করে স্প্রিং-বুট v1 এর উপর নির্ভরতা নোট করুন এবং সম্ভবত v2 এর জন্য ইঙ্গিত দিন, ধন্যবাদ.
ক্রিসিনমটাউন

1
পরিবর্তন: ব্যক্তিগত মানচিত্র <স্ট্রিং, অবজেক্ট> getErrorAttributes (HttpServletRequest aRequest, বুলিয়ান অন্তর্ভুক্ত স্ট্যাকট্র্যাস) est অনুরোধআর্টিব্রুটস অনুরোধএট্রিবিউটস = নতুন সার্লেটলেকুয়েস্ট্রিবিউটস (aRequest); রিটার্ন ত্রুটিঅ্যাট্রিবিউটস.জেটআরআরআর্ট্রিবিউটস (অনুরোধঅ্যাট্রিবিউটস, অন্তর্ভুক্ত স্ট্যাকট্র্যাস); } দ্বারা: প্রাইভেট ম্যাপ <স্ট্রিং, অবজেক্ট> getErrorAttributes (এইচটিপিএস সার্লেট রিকুয়েস্ট অনুরোধ, বুলিয়ান অন্তর্ভুক্ত স্ট্যাকট্র্যাস) {ওয়েবরয়েউকস্ট ওয়েবআরকুইস্ট = নতুন সার্লেটলেট ওয়েবসাইট (অনুরোধ); এইটি ফেরান }
রিজা রামাম্পিয়েন্দ্র

2
উপরের মন্তব্যগুলি বিবেচনা করে সিম্পলআরররন্ট্রোলআর জাভা এর একটি আপডেট সংস্করণ এখানে পাওয়া যাবে> gist.github.com/oscarnevarezleal/…
অস্কার

38

স্প্রিং বুট ডক 'ভুল ছিল' (তারা এটি ঠিক করে দিয়েছে):

এটিকে স্যুইচ করার জন্য আপনি ত্রুটি সেট করতে পারেন whWitelabel.en اهل = মিথ্যা

হতে হবে

এটিকে স্যুইচ করার জন্য আপনি সার্ভার.েরর.ভাইটেলাবেল.ইনবলড = মিথ্যা সেট করতে পারেন


এটি হোয়াইট লেবেল ত্রুটি পৃষ্ঠাটি অক্ষম করবে তবে বসন্ত বুটটি /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 { ... }

তবে খেয়াল রাখবেন যে এর ফলে সম্ভবত সার্লেলেট ধারকের হোয়াইটবেল পৃষ্ঠাগুলি পরিবর্তে প্রদর্শিত হবে :)


সম্পাদনা: এটি করার আরেকটি উপায় হ'ল অ্যাপ্লিকেশন.আইএমএল এর মাধ্যমে। স্রেফ মানটি লিখুন:

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

নথিপত্র

স্প্রিং বুট <2.0 এর জন্য, ক্লাসটি প্যাকেজে অবস্থিত org.springframework.boot.autoconfigure.web


15

ম্যানুয়াল এখানে বলে যে আপনাকে সেট server.error.whitelabel.enabledকরতে হবেfalse স্ট্যান্ডার্ড ত্রুটি পৃষ্ঠাটি অক্ষম হবে। আপনি কি চান এটি হতে পারে?

আমি যাইহোক / ত্রুটি ম্যাপিংয়ের পরে একই ত্রুটিটি অনুভব করছি।


হ্যাঁ আমি ইতিমধ্যে ত্রুটি সেট করেছি wh হোয়াইটবেল.এনবলড = মিথ্যা কিন্তু ত্রুটি ম্যাপিংয়ের পরে / ত্রুটির পরেও একই ত্রুটি
পেয়েছি

এটি হোয়াইট লেবেল ত্রুটি পৃষ্ঠাটি অক্ষম করবে তবে বসন্ত বুটটি /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);
  }
}

তবে তারপরে ব্যতিক্রমের ক্ষেত্রে সার্লেট পাত্রটি তার নিজস্ব ত্রুটি পৃষ্ঠা প্রদর্শন করবে।



6

স্প্রিং বুট ১.৪.১ এ গোঁফ টেমপ্লেটগুলি ব্যবহার করে, টেমপ্লেট ফোল্ডারের নীচে ত্রুটি 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/…
ই-তথ্য 128

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

আমি স্প্রিং বুট সংস্করণ errorAttributes.getErrorAttributes()২.১.২ ব্যবহার করছি এবং স্বাক্ষরটি আমার পক্ষে কার্যকর হয়নি (আকোহানের প্রতিক্রিয়াতে)। আমি একটি জেএসএন টাইপের প্রতিক্রিয়া চেয়েছিলাম তাই আমি কিছুটা খনন করেছিলাম এবং এই পদ্ধতিটি আমার প্রয়োজন মতো ঠিকঠাক করেছে।

আমি আমার বেশিরভাগ তথ্য এই থ্রেডের পাশাপাশি এই ব্লগ পোস্টটি থেকে পেয়েছি ।

প্রথমত, আমি একটি তৈরি করেছি 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অনুরোধ / প্রতিক্রিয়াগুলির জন্যও কাজ করা উচিত । তবে আমি এটি পরীক্ষা করিনি। আমি একটি রেস্টস্টুল এপিআই তৈরি করছিলাম এবং এটি কেবল জেএসএনকেই ফিরিয়ে দিতে চেয়েছিলাম ঠিক সেটাই করেছিল did


2

server.error.whitelabel.enabled = মিথ্যা

উপরের লাইনটি রিসোর্স ফোল্ডারগুলি প্রয়োগ করুন

আরও ত্রুটি সমস্যার সমাধান দয়া করে http://docs.spring.io/spring-boot/docs/cटका/references/htmlsingle/#howto-customize-the- whitelabel-error-page দেখুন


আমি আমার ইনস্টলেশন ফোল্ডারে অ্যাপ্লিকেশন.প্রেটিটির চেষ্টা করেছি যা কিছুই করেনি। / Src / প্রধান / সংস্থানসমূহের আওতায় অ্যাপ্লিকেশন.প্রোপার্টি ফোল্ডারটি সুগন্যা সুদানই বোঝাতে চাইছিল। এটি Eclipse এ "হট রিড" হিসাবে উপস্থিত হবে বলে মনে হয়।
রিচার্ড ব্র্যাডলি স্মিথ

1

আমি একটি মাইক্রোসার্ভাইস থেকে একটি আরএসটি এন্ডপয়েন্টে কল করার চেষ্টা করছিলাম এবং আমি রেস্টস্টেমলেটটির পুট পদ্ধতিটি ব্যবহার করছিলাম ।

আমার ডিজাইনে যদি রেস্টের শেষ পয়েন্টের মধ্যে কোনও ত্রুটি দেখা দেয় তবে এটি কোনও জেএসওএন ত্রুটির প্রতিক্রিয়া ফিরিয়ে আনবে, এটি কিছু কলের জন্য কাজ করছে তবে এই কলটির জন্য নয় , এটি সাদা লেবেলের ত্রুটি পৃষ্ঠাটি ফেরত দিয়েছে পরিবর্তে ।

সুতরাং আমি কিছু তদন্ত করেছি এবং আমি এটি জানতে পেরেছি;

ফোনটি কল করার বিষয়টি স্প্রিংয়ের সাথে বোঝার চেষ্টা করুন যদি এটি কোনও মেশিন হয় তবে এটি JSON প্রতিক্রিয়া ফিরিয়ে দেয় বা এটি যদি কোনও ব্রাউজার হয় তবে এটি সাদা লেবেলের ত্রুটি পৃষ্ঠা HTML প্রদান করে।

ফলস্বরূপ: আমার ক্লায়েন্ট অ্যাপ্লিকেশনটিকে REST এন্ডপয়েন্টে বলতে হবে যে কলারটি একটি মেশিন, ব্রাউজার নয় তাই এই ক্লায়েন্ট অ্যাপটির জন্য ' অ্যাপ্লিকেশন / জেসন যুক্ত করতে হবে পুনরায় পুনর্নির্মাণের 'পুট' পদ্ধতির জন্য এসিসিপিটি শিরোনামে জেসন' যুক্ত করতে হবে। আমি এটি শিরোনামে যুক্ত করেছি এবং সমস্যার সমাধান করেছি।

শেষের দিকে আমার কল:

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

উপরের কলের জন্য আমাকে নীচে হেডার প্যারাম যুক্ত করতে হয়েছিল।

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

বা আমি পাশাপাশি এক্সচেঞ্জের বদলে রাখার চেষ্টা করেছি, এই ক্ষেত্রে, এক্সচেঞ্জ কলটি আমার জন্য একই শিরোনাম যুক্ত করেছিল এবং সমস্যাটিও সমাধান করেছে তবে কেন জানি না :)

restTemplate.exchange(....)

0

ডিফল্টরূপে স্প্রিং বুটটিতে একটি " হোয়াইটবেল " ত্রুটি পৃষ্ঠা রয়েছে যা আপনি যদি কোনও সার্ভার ত্রুটির মুখোমুখি হন তবে আপনি ব্রাউজারে দেখতে পাবেন। হোয়াইটবেল ত্রুটি পৃষ্ঠা হ'ল একটি সাধারণ স্প্রিং বুট ত্রুটি পৃষ্ঠা যা প্রদর্শিত হয় যখন কোনও কাস্টম ত্রুটি পৃষ্ঠা পাওয়া যায় না।

ডিফল্ট ত্রুটি পৃষ্ঠাটিতে স্যুইচ করতে "সার্ভার.অরর.ভাইটেলাবেল.এনবলড = মিথ্যা" সেট করুন


0

আমি যখনই রিফ্রেশ করি তখন আমার কৌনিক এসপিএতে হোয়াইটবেল ত্রুটির বার্তা ছিল।

ফিক্সটি এমন একটি নিয়ামক তৈরি করা হয়েছিল যা ত্রুটি নিয়ন্ত্রণকারীকে কার্যকর করে তবে একটি স্ট্রিং ফিরিয়ে না দেওয়ার পরিবর্তে আমাকে একটি মডেলঅ্যান্ডভিউ অবজেক্ট ফিরিয়ে দিতে হবে যা পূর্বে /

@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;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.