স্প্রিং বুটের সাহায্যে, কেন এটি প্রয়োজনীয় ছিল তা আমি পুরোপুরি নিশ্চিত নই (আমি /error
ফ্যালব্যাক পেয়েছি যদিও একটিতে @ResponseBody
সংজ্ঞায়িত করা হয়েছিল @ExceptionHandler
), কিন্তু নিম্নলিখিতটি নিজেই কার্যকর হয়নি:
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorMessage handleIllegalArguments(HttpServletRequest httpServletRequest, IllegalArgumentException e) {
log.error("Illegal arguments received.", e);
ErrorMessage errorMessage = new ErrorMessage();
errorMessage.code = 400;
errorMessage.message = e.getMessage();
return errorMessage;
}
এটি এখনও একটি ব্যতিক্রম ছুঁড়ে দিয়েছে, দৃশ্যত কোনও উত্পাদনযোগ্য মিডিয়া প্রকারকে অনুরোধের বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করা হয়নি:
// AbstractMessageConverterMethodProcessor
@SuppressWarnings("unchecked")
protected <T> void writeWithMessageConverters(T value, MethodParameter returnType,
ServletServerHttpRequest inputMessage, ServletServerHttpResponse outputMessage)
throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {
Class<?> valueType = getReturnValueType(value, returnType);
Type declaredType = getGenericType(returnType);
HttpServletRequest request = inputMessage.getServletRequest();
List<MediaType> requestedMediaTypes = getAcceptableMediaTypes(request);
List<MediaType> producibleMediaTypes = getProducibleMediaTypes(request, valueType, declaredType);
if (value != null && producibleMediaTypes.isEmpty()) {
throw new IllegalArgumentException("No converter found for return value of type: " + valueType); // <-- throws
}
// ....
@SuppressWarnings("unchecked")
protected List<MediaType> getProducibleMediaTypes(HttpServletRequest request, Class<?> valueClass, Type declaredType) {
Set<MediaType> mediaTypes = (Set<MediaType>) request.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);
if (!CollectionUtils.isEmpty(mediaTypes)) {
return new ArrayList<MediaType>(mediaTypes);
সুতরাং আমি তাদের যোগ।
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorMessage handleIllegalArguments(HttpServletRequest httpServletRequest, IllegalArgumentException e) {
Set<MediaType> mediaTypes = new HashSet<>();
mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
httpServletRequest.setAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, mediaTypes);
log.error("Illegal arguments received.", e);
ErrorMessage errorMessage = new ErrorMessage();
errorMessage.code = 400;
errorMessage.message = e.getMessage();
return errorMessage;
}
এবং এটি আমাকে "সমর্থিত সামঞ্জস্যপূর্ণ মিডিয়া টাইপ" করতে পেরেছিল, কিন্তু তারপরেও এটি কার্যকর হয়নি কারণ আমার ErrorMessage
ত্রুটিযুক্ত ছিল:
public class ErrorMessage {
int code;
String message;
}
JacksonMapper, যেমন "convertable" এটি পরিচালনা করা হয়নি তাই আমি getters / setters যোগ করার জন্য ছিল, এবং আমি আরও যোগ করেছেন @JsonProperty
টীকা
public class ErrorMessage {
@JsonProperty("code")
private int code;
@JsonProperty("message")
private String message;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
তারপরে আমি আমার বার্তাটি ইচ্ছামত পেয়েছি
{"code":400,"message":"An \"url\" parameter must be defined."}
ResponseEntity
এটিও এর মতো ব্যবহার করতে পারেন । এটি দুর্দান্তভাবে কাজ করে এবং মূল কোডটিতে কেবল একটি সাধারণ পরিবর্তন — ধন্যবাদ!