জ্যাকস-আরএস / জার্সি কীভাবে ত্রুটি পরিচালনা পরিচালনা করতে পারে?


216

আমি জার্সি ব্যবহার করে জ্যাকস-আরএস (ওরফে, জেএসআর -311) শিখছি। আমি সাফল্যের সাথে একটি রুট রিসোর্স তৈরি করেছি এবং পরামিতিগুলি নিয়ে খেলছি:

@Path("/hello")
public class HelloWorldResource {

    @GET
    @Produces("text/html")
    public String get(
        @QueryParam("name") String name,
        @QueryParam("birthDate") Date birthDate) {

         // Return a greeting with the name and age
    }
}

এটি দুর্দান্ত কাজ করে এবং বর্তমান লোকেলের যে কোনও বিন্যাস পরিচালনা করে যা তারিখ (স্ট্রিং) নির্মাতা (ওয়াইওয়াইওয়াই / মিমি / ডিডি এবং মিমি / ডিডি / ওয়াইওয়াইওয়াইয়ের মত) বোঝে। তবে আমি যদি এমন কোনও মান সরবরাহ করি যা অবৈধ বা বোঝা যায় না, আমি একটি 404 প্রতিক্রিয়া পাই।

উদাহরণ স্বরূপ:

GET /hello?name=Mark&birthDate=X

404 Not Found

আমি কীভাবে এই আচরণটি কাস্টমাইজ করতে পারি? হতে পারে একটি ভিন্ন প্রতিক্রিয়া কোড (সম্ভবত "400 খারাপ অনুরোধ")? একটি ত্রুটি লগিং সম্পর্কে কি? সমস্যার সমাধানে সহায়তার জন্য কাস্টম শিরোনামে সমস্যার বিবরণ ("খারাপ তারিখের ফর্ম্যাট") যুক্ত করুন? অথবা 5XX স্থিতি কোড সহ বিশদ বিবরণ সহ পুরো ত্রুটি প্রতিক্রিয়া ফিরিয়ে দিন?

উত্তর:


271

জ্যাক্স-আরএসের সাথে ত্রুটি পরিচালনার আচরণটি কাস্টমাইজ করার জন্য কয়েকটি পদ্ধতি রয়েছে। এখানে তিনটি সহজ উপায়।

প্রথম পদ্ধতির মধ্যে একটি ব্যতিক্রম শ্রেণি তৈরি করা যা ওয়েব অ্যাপ্লিকেশনএক্সসেপশনকে প্রসারিত করে।

উদাহরণ:

public class NotAuthorizedException extends WebApplicationException {
     public NotAuthorizedException(String message) {
         super(Response.status(Response.Status.UNAUTHORIZED)
             .entity(message).type(MediaType.TEXT_PLAIN).build());
     }
}

এবং এই নতুন তৈরি ব্যতিক্রমটি আপনি সহজেই ছুঁড়ে ফেলার জন্য:

@Path("accounts/{accountId}/")
    public Item getItem(@PathParam("accountId") String accountId) {
       // An unauthorized user tries to enter
       throw new NotAuthorizedException("You Don't Have Permission");
}

লক্ষ্য করুন, আপনার থ্রো ক্লজে ব্যতিক্রমটি প্রকাশ করার দরকার নেই কারণ ওয়েব অ্যাপ্লিকেশনএক্সেপশন একটি রানটাইম ব্যতিক্রম। এটি ক্লায়েন্টের একটি 401 প্রতিক্রিয়া ফিরিয়ে দেবে।

দ্বিতীয় এবং সহজ পন্থাটি হ'ল আপনার কোডটিতে WebApplicationExceptionসরাসরি কোনও উদাহরণ তৈরি করা । আপনার নিজের প্রয়োগ ব্যতিক্রমগুলি প্রয়োগ করতে হবে না এমন সময় পর্যন্ত এই পদ্ধতির কাজ করে।

উদাহরণ:

@Path("accounts/{accountId}/")
public Item getItem(@PathParam("accountId") String accountId) {
   // An unauthorized user tries to enter
   throw new WebApplicationException(Response.Status.UNAUTHORIZED);
}

এই কোডটি ক্লায়েন্টকে 401 প্রদান করে।

অবশ্যই এটি একটি সাধারণ উদাহরণ। প্রয়োজনে আপনি ব্যতিক্রমটিকে আরও জটিল করে তুলতে পারেন এবং আপনি যে কোনও HTTP রেসপন্স কোডের প্রয়োজন তা তৈরি করতে পারেন।

অন্য একটি পদ্ধতি হ'ল একটি বিদ্যমান ব্যতিক্রম মোড়ানো, সম্ভবত এটি ObjectNotFoundExceptionএকটি ছোট র‌্যাপার ক্লাস ExceptionMapperসহ যা কোনও @Providerটিকা দিয়ে টীকাকৃত ইন্টারফেসটি প্রয়োগ করে । এটি জ্যাকস-আরএস রানটাইমকে বলে, যে মোড়ানো ব্যতিক্রমটি যদি উত্থাপিত হয় তবে, সংজ্ঞায়িত প্রতিক্রিয়া কোডটি ফিরিয়ে দিন ExceptionMapper


3
আপনার উদাহরণে, সুপার () এ কলটি কিছুটা আলাদা হওয়া উচিত: সুপার (রেসপন্স.স্ট্যাটাস (স্ট্যাটাস। ইউএনএইচটিরিজড)। সত্তা (বার্তা)। টাইপ ("পাঠ্য / সমতল")। বিল্ড ()); অন্তর্দৃষ্টি জন্য ধন্যবাদ যদিও।
জন অনস্টট

65
প্রশ্নে উল্লিখিত দৃশ্যে, আপনি একটি ব্যতিক্রম ছুঁড়ে দেওয়ার সুযোগ পাবেন না, কারণ জার্সি ব্যতিক্রম উত্থাপন করবে কারণ এটি ইনপুট মান থেকে তারিখ অবজেক্টের উদাহরণ তৈরি করতে সক্ষম হবে না। জার্সির ব্যতিক্রমকে বাধা দেওয়ার কোনও উপায় আছে কি? একটি ব্যতিক্রমী ম্যাপার ইন্টারফেস রয়েছে, তবে এটি পদ্ধতি দ্বারা ছড়িয়ে দেওয়া ব্যতিক্রমগুলিও বাধা দেয় (এই ক্ষেত্রে পান)।
রেজিভ দিবাকরণ

7
404 একটি বৈধ কেস এবং কোনও ত্রুটি না হলে আপনার সার্ভার লগগুলিতে উপস্থিত হওয়ার ব্যতিক্রমটিকে আপনি কীভাবে এড়াতে পারবেন (যেমন আপনি যখনই কোনও উত্স অনুসন্ধানের জন্য জিজ্ঞাসা করছেন, এটি ইতিমধ্যে উপস্থিত রয়েছে কিনা তা দেখার জন্য, আপনার পদ্ধতির সাথে সার্ভারে একটি স্ট্যাকট্রেস উপস্থিত রয়েছে) লগগুলি)।
গুইডো

3
জার্সি ২.x সাধারণ কিছু এইচটিটিপি ত্রুটি কোডের জন্য ব্যতিক্রম সংজ্ঞা দেয় উল্লেখযোগ্য। সুতরাং ওয়েব অ্যাপ্লিকেশনটির নিজস্ব সাবক্লাসগুলি সংজ্ঞায়িত করার পরিবর্তে, আপনি BadRequestException এবং NotAuthorisedException এর মতো বিল্ট-ইনগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ javax.ws.rs.ClientErrorException এর সাবক্লাসটি দেখুন। এছাড়াও নোট করুন আপনি নির্মাণকারীদের একটি বিশদ স্ট্রিং সরবরাহ করতে পারেন। উদাহরণস্বরূপ: নতুন BadRequestException নিক্ষেপ করুন ("শুরুর তারিখ অবশ্যই শেষের তারিখের আগে অবশ্যই");
বাম্পফার

1
আপনি আর একটি পদ্ধতির উল্লেখ করতে ভুলে গেছেন: ExceptionMapperইন্টারফেস বাস্তবায়ন (যা আরও ভাল পদ্ধতির পরে প্রসারিত)। এখানে আরও দেখুন vvirlan.wordpress.com/2015/10/19/…
ACV

70
@Provider
public class BadURIExceptionMapper implements ExceptionMapper<NotFoundException> {

public Response toResponse(NotFoundException exception){

    return Response.status(Response.Status.NOT_FOUND).
    entity(new ErrorResponse(exception.getClass().toString(),
                exception.getMessage()) ).
    build();
}
}

উপরের ক্লাস তৈরি করুন। এটি 404 (নটফাউন্ডএক্সেপশন) পরিচালনা করবে এবং এখানে টেস রেসপন্স পদ্ধতিতে আপনি আপনার কাস্টম প্রতিক্রিয়া দিতে পারেন। একইভাবে এখানে প্যারামএক্সেপশন ইত্যাদি রয়েছে যা কাস্টমাইজড প্রতিক্রিয়া সরবরাহ করতে আপনাকে মানচিত্রের প্রয়োজন হবে।


জেনেরিক ব্যতিক্রমগুলির জন্য আপনি এক্সপ্লেশনম্যাপার <এক্সেকশন> প্রয়োগগুলিও ব্যবহার করতে পারেন
সৌরভ

1
এটি JAX-RS ক্লায়েন্টের দ্বারা ছুঁড়ে দেওয়া ওয়েব অ্যাপ্লিকেশনএক্সেপশনগুলিও পরিচালনা করবে, ত্রুটির উত্সটি লুকিয়ে রাখবে। আরও ভাল কাস্টম ব্যতিক্রম (ওয়েব অ্যাপ্লিকেশনএক্সেপশন থেকে প্রাপ্ত নয়) বা সম্পূর্ণ প্রতিক্রিয়া সহ ওয়েব অ্যাপ্লিকেশনগুলি ছুঁড়ে ফেলা ভাল। জ্যাকস-আরএস ক্লায়েন্টের দ্বারা ছড়িয়ে দেওয়া ওয়েব অ্যাপ্লিকেশনএক্সেপশনগুলি সরাসরি কলটিতে পরিচালনা করা উচিত, অন্যথায় অন্য কোনও পরিষেবার প্রতিক্রিয়া আপনার পরিষেবার প্রতিক্রিয়া হিসাবে পেরিয়ে যায় যদিও এটি একটি নিয়ন্ত্রণহীন অভ্যন্তরীণ সার্ভার ত্রুটি।
মার্কাস কুল

38

জার্সি একটি com.sun.jersey.api.ParamException ছুঁড়ে দেয় যখন প্যারামিটারগুলি আনমশাল করতে ব্যর্থ হয় তাই এক সমাধান হ'ল এই ধরণের ব্যতিক্রমগুলি পরিচালনা করে এমন একটি এক্সপেশনম্যাপার তৈরি করা:

@Provider
public class ParamExceptionMapper implements ExceptionMapper<ParamException> {
    @Override
    public Response toResponse(ParamException exception) {
        return Response.status(Status.BAD_REQUEST).entity(exception.getParameterName() + " incorrect type").build();
    }
}

জার্সির এটি রেজিস্ট্রেশন করার জন্য বিশেষত এই ম্যাপারটি কোথায় তৈরি করব?
প্যাট্রিসিও

1
: সমস্ত আপনাকে যা করতে হবে @Provider টীকা, আরো বিস্তারিত জানার জন্য এখানে দেখতে যোগ হয় stackoverflow.com/questions/15185299/...
জানুয়ারী Kronquist

27

আপনি ক্যোয়ারিপ্যারাম-এনোটেটেড ভেরিয়েবলগুলির জন্য একটি পুনরায় ব্যবহারযোগ্য শ্রেণিও লিখতে পারেন

public class DateParam {
  private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

  private Calendar date;

  public DateParam(String in) throws WebApplicationException {
    try {
      date = Calendar.getInstance();
      date.setTime(format.parse(in));
    }
    catch (ParseException exception) {
      throw new WebApplicationException(400);
    }
  }
  public Calendar getDate() {
    return date;
  }
  public String format() {
    return format.format(value.getTime());
  }
}

তারপরে এটি ব্যবহার করুন:

private @QueryParam("from") DateParam startDateParam;
private @QueryParam("to") DateParam endDateParam;
// ...
startDateParam.getDate();

ত্রুটি পরিচালনার ক্ষেত্রে এই ক্ষেত্রে তুচ্ছ (400 প্রতিক্রিয়া নিক্ষেপ করা), এই শ্রেণিটি ব্যবহারের ফলে আপনি সাধারণভাবে পরামিতি হ্যান্ডলিংকে ফাংশন-আউট করতে পারবেন যা লগিং ইত্যাদি অন্তর্ভুক্ত করতে পারে include


আমি জার্সিতে একটি কাস্টম ক্যোয়ারী প্যারাম হ্যান্ডলার যুক্ত করার চেষ্টা করছি (সিএক্সএফ থেকে মাইগ্রেট করা) এটি আমি যা করছি তার তুলনায় উল্লেখযোগ্যভাবে অনুরূপ তবে আমি কীভাবে একটি নতুন সরবরাহকারী ইনস্টল / তৈরি করতে জানি না। আপনার উপরের ক্লাসটি আমাকে এটি দেখায় না। আমি কোয়েরিপারামের জন্য জোডটাইম ডেটটাইম অবজেক্টগুলি ব্যবহার করছি এবং সেগুলি ডিকোড করার কোনও সরবরাহকারী নেই। এটি কি কেবল এটি সাবক্লাসিংয়ের মতো সহজ, এটিকে একটি স্ট্রিং কনস্ট্রাক্টর দেওয়া এবং এটি পরিচালনা করার মতো?
খ্রিস্টান বনজিওর্নো

1
DateParamউপরের মতো একটি ক্লাস তৈরি করুন যা তার org.joda.time.DateTimeপরিবর্তে একটি মোড়কে java.util.Calendar। আপনি এটি নিজের @QueryParamচেয়ে বরং ব্যবহার করুন DateTime
চার্লি ব্রুকিং

1
আপনি যদি জোদা ডেটটাইম ব্যবহার করে থাকেন তবে সরাসরি ব্যবহার করার জন্য জার্সি ডেটটাইমপ্রাম নিয়ে আসে। আপনার নিজের লেখার দরকার নেই। Github.com/DPwizard/DPwizard/blob/master/DPwizard-jersey/…
শ্রীকান্ত

আমি এটি যুক্ত করতে যাচ্ছি কারণ এটির দুর্দান্ত দরকারী, তবে আপনি যদি জার্সির সাথে জ্যাকসন ব্যবহার করছেন। জ্যাকসন ২.x এর একটি রয়েছে JodaModuleযা ObjectMapper registerModulesপদ্ধতিতে নিবন্ধিত হতে পারে । এটি জোদা টাইপের সমস্ত রূপান্তর পরিচালনা করতে পারে। com.fasterxml.jackson.datatype.joda.JodaModule
j_ওয়ালার_দেব

11

একটি সুস্পষ্ট সমাধান: একটি স্ট্রিং নিন, নিজেকে তারিখে রূপান্তর করুন। আপনি যে ফর্ম্যাটটি চান তা সংজ্ঞায়িত করতে পারেন, ব্যতিক্রমগুলি ধরতে পারেন এবং পুনরায় নিক্ষেপ বা কাস্টমাইজ করতে ত্রুটি পাঠানো হচ্ছে। পার্সিংয়ের জন্য, সিম্পলডিটফর্ম্যাটটি ভাল কাজ করা উচিত।

আমি নিশ্চিত যে ডেটা প্রকারের জন্যও হ্যান্ডলারের হুক করার উপায় রয়েছে তবে এই ক্ষেত্রে আপনার কেবলমাত্র সামান্য কোডের প্রয়োজন।


7

আমিও পছন্দ করি স্ট্যাকসম্যান সম্ভবত সেই ক্যুরিপ্যারামকে একটি স্ট্রিং হিসাবে বাস্তবায়ন করবে, তারপরে রূপান্তরটি পরিচালনা করবে, প্রয়োজনীয় হিসাবে পুনর্বিবেচনা করবে।

যদি স্থানীয় নির্দিষ্ট আচরণটি কাঙ্ক্ষিত এবং প্রত্যাশিত আচরণ হয় তবে 400 বিএডির অনুরোধ ত্রুটি ফিরে পাওয়ার জন্য আপনি নিম্নলিখিতটি ব্যবহার করবেন:

throw new WebApplicationException(Response.Status.BAD_REQUEST);

Javax.ws.rs.core.Response.Status এর জন্য আরও বিকল্পের জন্য জাভাডোক দেখুন।


4

@ কুইয়ারপ্যারাম ডকুমেন্টেশন বলছে

"এনোটোটেড প্যারামিটারের ক্ষেত্রের টি, ক্ষেত্র বা সম্পত্তি অবশ্যই হয়:

১) আদিম ধরণের হয়ে উঠুন
২) এমন একটি কনস্ট্রাক্টর থাকুন যা একটি একক স্ট্রিং আর্গুমেন্টকে গ্রহণ করে
3) একটি স্ট্রিং আর্গুমেন্টকে মান হিসাবে স্ট্যান্ড আউট অফ বা স্ট্রিং নামে একটি স্ট্যাটিক পদ্ধতি রয়েছে (দেখুন, উদাহরণস্বরূপ, পূর্ণসংখ্যা.মূল্যঅফ (স্ট্রিং))
4) একটি আছে javax.ws.rs.ext.PramConverterProvider JAX-RS এক্সটেনশন এসপিআই এর নিবন্ধিত প্রয়োগ যা এই জাভ্যাক্স.উস.আর.সেক্সট.পর্মকোনভার্টর উদাহরণটি "স্ট্রিং থেকে" ধরণের রূপান্তর করতে সক্ষম capable
5) তালিকাগুলি, সেট বা সাজানো সেট থাকুন, যেখানে টি উপরে 2, 3 বা 4 সন্তুষ্ট করে। ফলাফল সংগ্রহ কেবল পঠনযোগ্য। "

স্ট্রিং ফর্মের ক্যোয়ারী প্যারামিটারগুলি আপনার টাইপ টি তে রূপান্তর করতে না পারলে আপনি কী প্রতিক্রিয়া ব্যবহারকারীর কাছে যান তা যদি আপনি নিয়ন্ত্রণ করতে চান তবে আপনি ওয়েব অ্যাপ্লিকেশনএক্সেপশন ফেলে দিতে পারেন। ড্রপউইজার্ড নিম্নলিখিত * পরম ক্লাসগুলির সাথে আসে যা আপনি আপনার প্রয়োজনের জন্য ব্যবহার করতে পারেন।

বুলিয়ানপ্রাম, ডেটটাইমপারাম, ইন্টপারাম, লংপ্রাম, লোকালডিটপ্যারাম, নন-এমপি স্ট্রিংপরাম, ইউইউডিপিরাম। দেখাHttps://github.com/DPwizard/DPwizard/tree/master/DPwizard-jersey/src/main/java/io/DPwizard/jersey/params

আপনি Joda তারিখসময় প্রয়োজন হয়, তাহলে শুধু Dropwizard ব্যবহার DateTimeParam

যদি উপরের তালিকাটি আপনার প্রয়োজনের সাথে মানানসই না হয় তবে অ্যাবস্ট্রাক্টাম প্রসারিত করে নিজের সংজ্ঞা দিন। পার্স পদ্ধতিতে ওভাররাইড করুন। আপনার যদি ত্রুটি প্রতিক্রিয়া বডির উপর নিয়ন্ত্রণের প্রয়োজন হয় তবে ত্রুটি পদ্ধতি ওভাররাইড করুন।

এর সম্পর্কে কোডা হেল থেকে ভাল নিবন্ধটি http://codahale.com/hat-makes-jersey-interesting-parameter-classes/ এ রয়েছে

import io.dropwizard.jersey.params.AbstractParam;

import java.util.Date;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

public class DateParam extends AbstractParam<Date> {

    public DateParam(String input) {
        super(input);
    }

    @Override
    protected Date parse(String input) throws Exception {
        return new Date(input);
    }

    @Override
    protected Response error(String input, Exception e) {
        // customize response body if you like here by specifying entity
        return Response.status(Status.BAD_REQUEST).build();
    }
}

তারিখ (স্ট্রিং আরগ) কনস্ট্রাক্টর অবচিত হয়। আপনি জাভা 8 এ থাকলে আমি জাভা 8 তারিখের ক্লাস ব্যবহার করবো Otherwise নইলে জোডা তারিখের সময় প্রস্তাবিত।


1

এটি আসলে সঠিক আচরণ। জার্সি আপনার ইনপুটটির জন্য কোনও হ্যান্ডলার সন্ধান করার চেষ্টা করবে এবং সরবরাহিত ইনপুট থেকে কোনও অবজেক্ট তৈরির চেষ্টা করবে। এক্ষেত্রে এটি কনস্ট্রাক্টরকে সরবরাহ করা মান X সহ একটি নতুন তারিখ অবজেক্ট তৈরি করার চেষ্টা করবে। যেহেতু এটি একটি অবৈধ তারিখ, সম্মেলনে জার্সি 404 ফেরত আসবে return

আপনি যা করতে পারেন তা আবার লেখার জন্য এবং জন্মের তারিখটিকে স্ট্রিং হিসাবে রাখুন, তারপরে পার্স করার চেষ্টা করুন এবং আপনি যা চান তা না পেলে ব্যতিক্রম ম্যাপিংয়ের যেকোন একটি দ্বারা আপনি যে কোনও ব্যতিক্রম চান তা ছুঁড়ে দিতে মুক্ত হন (বেশ কয়েকটি রয়েছে )।


1

আমি একই সমস্যা ছিল।

আমি একটি কেন্দ্রীয় জায়গায় সমস্ত ত্রুটিগুলি ধরতে এবং সেগুলি রূপান্তর করতে চেয়েছিলাম।

আমি কীভাবে এটি পরিচালনা করেছি তার জন্য কোডটি নীচে দেওয়া হল।

নিম্নলিখিত ক্লাসটি তৈরি করুন যা প্রয়োগ করে ExceptionMapperএবং @Providerএই শ্রেণিতে টিকা যুক্ত করে। এটি সমস্ত ব্যতিক্রম পরিচালনা করবে।

ওভাররাইড toResponseপদ্ধতিটি এবং কাস্টমাইজড ডেটা দিয়ে জনবহুল প্রতিক্রিয়াটি প্রত্যাবর্তন করুন।

//ExceptionMapperProvider.java
/**
 * exception thrown by restful endpoints will be caught and transformed here
 * so that client gets a proper error message
 */
@Provider
public class ExceptionMapperProvider implements ExceptionMapper<Throwable> {
    private final ErrorTransformer errorTransformer = new ErrorTransformer();

    public ExceptionMapperProvider() {

    }

    @Override
    public Response toResponse(Throwable throwable) {
        //transforming the error using the custom logic of ErrorTransformer 
        final ServiceError errorResponse = errorTransformer.getErrorResponse(throwable);
        final ResponseBuilder responseBuilder = Response.status(errorResponse.getStatus());

        if (errorResponse.getBody().isPresent()) {
            responseBuilder.type(MediaType.APPLICATION_JSON_TYPE);
            responseBuilder.entity(errorResponse.getBody().get());
        }

        for (Map.Entry<String, String> header : errorResponse.getHeaders().entrySet()) {
            responseBuilder.header(header.getKey(), header.getValue());
        }

        return responseBuilder.build();
    }
}

// ErrorTransformer.java
/**
 * Error transformation logic
 */
public class ErrorTransformer {
    public ServiceError getErrorResponse(Throwable throwable) {
        ServiceError serviceError = new ServiceError();
        //add you logic here
        serviceError.setStatus(getStatus(throwable));
        serviceError.setBody(getBody(throwable));
        serviceError.setHeaders(getHeaders(throwable));

    }
    private String getStatus(Throwable throwable) {
        //your logic
    }
    private Optional<String> getBody(Throwable throwable) {
        //your logic
    }
    private Map<String, String> getHeaders(Throwable throwable) {
        //your logic
    }
}

//ServiceError.java
/**
 * error data holder
 */
public class ServiceError {
    private int status;
    private Map<String, String> headers;
    private Optional<String> body;
    //setters and getters
}

1

পদ্ধতির 1: ওয়েব অ্যাপ্লিকেশনএক্সেপশন ক্লাসটি বাড়িয়ে

ওয়েব অ্যাপ্লিকেশনএক্সসেপশন বাড়িয়ে নতুন ব্যতিক্রম তৈরি করুন

public class RestException extends WebApplicationException {

         private static final long serialVersionUID = 1L;

         public RestException(String message, Status status) {
         super(Response.status(status).entity(message).type(MediaType.TEXT_PLAIN).build());
         }
}

যখনই প্রয়োজন হবে তখন 'রেস্টেক্সেপশন' নিক্ষেপ করুন।

public static Employee getEmployee(int id) {

         Employee emp = employees.get(id);

         if (emp == null) {
                 throw new RestException("Employee with id " + id + " not exist", Status.NOT_FOUND);
         }
         return emp;
}

আপনি এই লিঙ্কে সম্পূর্ণ অ্যাপ্লিকেশন দেখতে পারেন ।

পন্থা 2: এক্সসেপশন ম্যাপার প্রয়োগ করুন

নিম্নলিখিত ম্যাপারগুলি 'ডেটানটফাউন্ডএক্সসেপশন' টাইপের ব্যতিক্রমগুলি পরিচালনা করে

@Provider
public class DataNotFoundExceptionMapper implements
        ExceptionMapper<DataNotFoundException> {

    @Override
    public Response toResponse(DataNotFoundException ex) {
        ErrorMessage model = new ErrorMessage(ex.getErrorCode(),
                ex.getMessage());
        return Response.status(Status.NOT_FOUND).entity(model).build();
    }

}

আপনি এই লিঙ্কে সম্পূর্ণ অ্যাপ্লিকেশন দেখতে পারেন ।


0

আপনি ব্রাউজার লগইন উইন্ডোটি খুলতে চান সেক্ষেত্রে @ স্টিভেন ল্যাভিনের উত্তর হিসাবে একটি এক্সটেনশন। ফিল্টার থেকে যথাযথভাবে প্রতিক্রিয়া ( MDN HTTP প্রমাণীকরণ ) ফিরিয়ে আনা আমার পক্ষে কঠিন মনে হয়েছে যে ব্যবহারকারী এখনও প্রমাণীকৃত হয়নি

এটি আমাকে ব্রাউজার লগইনকে বাধ্য করার জন্য প্রতিক্রিয়া তৈরি করতে সহায়তা করেছে, শিরোনামগুলির অতিরিক্ত পরিবর্তনটি নোট করুন। এটি স্থিতি কোডটি 401 এ সেট করবে এবং শিরোনামটি সেট করবে যা ব্রাউজারটির ব্যবহারকারীর নাম / পাসওয়ার্ড ডায়ালগ খোলার কারণ হয়।

// The extended Exception class
public class NotLoggedInException extends WebApplicationException {
  public NotLoggedInException(String message) {
    super(Response.status(Response.Status.UNAUTHORIZED)
      .entity(message)
      .type(MediaType.TEXT_PLAIN)
      .header("WWW-Authenticate", "Basic realm=SecuredApp").build()); 
  }
}

// Usage in the Filter
if(headers.get("Authorization") == null) { throw new NotLoggedInException("Not logged in"); }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.