Подтвердить что ты не робот

Каков наилучший способ вернуть различные типы ResponseEntity в Spring MVC или Spring-Boot

Я написал простое приложение для отдыха с использованием Spring MVC 4 (или Spring-Boot). Внутри контроллера я возвращаю ResponseEntity. Но в некоторых случаях я хочу дать успех JSON, и если есть ошибка проверки, я хочу дать ошибку JSON. В настоящее время успех и ответы об ошибках совершенно разные, поэтому я создал 2 класса для ошибок и успехов. Внутри контроллера я хочу вернуть ResponseEntity<Success>, если внутренняя логика в порядке. В противном случае я хочу вернуть ResponseEntity<Error>. Есть ли способ сделать это.

Success и Error - это 2 класса, которые я использую для представления успеха и ответа на ошибки.

4b9b3361

Ответ 1

Вы можете реализовать, как показано ниже, чтобы вернуть Success and Error в один и тот же метод сопоставления запросов

public ResponseEntity<?> method() {
    boolean b = // some logic
    if (b)
        return new ResponseEntity<Success>(HttpStatus.OK);
    else
        return new ResponseEntity<Error>(HttpStatus.CONFLICT); //appropriate error code
}

Ответ 2

Я рекомендую использовать Spring @ControllerAdvice для обработки ошибок проверки. Прочитайте это руководство для хорошего ознакомления, начиная с раздела "Обработка ошибок Spring Boot". Для углубленного обсуждения, есть статья в блоге Spring.io, которая была обновлена в апреле 2018 года.

Краткое описание того, как это работает:

  • Ваш метод контроллера должен возвращать только ResponseEntity<Success>. Он не будет нести ответственность за возврат ошибок или ответов об исключениях.
  • Вы реализуете класс, который обрабатывает исключения для всех контроллеров. Этот класс будет аннотирован с помощью @ControllerAdvice
  • Этот класс совета контроллера будет содержать методы, аннотированные @ExceptionHandler
  • Каждый метод обработчика исключений будет настроен для обработки одного или нескольких типов исключений. Эти методы, где вы указываете тип ответа для ошибок
  • Для вашего примера вы бы объявили (в классе совета контроллера) метод обработчика исключений для ошибки валидации. Тип возвращаемого значения: ResponseEntity<Error>

При таком подходе вам нужно только реализовать обработку исключений вашего контроллера в одном месте для всех конечных точек в вашем API. Это также облегчает для вашего API единообразную структуру ответов на все конечные точки. Это упрощает обработку исключений для ваших клиентов.

Ответ 3

я не уверен, но я думаю, что вы можете использовать @ResponseEntity и @ResponseBody и отправить 2 разных - Успех, а второй - сообщение об ошибке, например:

@RequestMapping(value ="/book2", produces =MediaType.APPLICATION_JSON_VALUE )
@ResponseBody
Book bookInfo2() {
    Book book = new Book();
    book.setBookName("Ramcharitmanas");
    book.setWriter("TulasiDas");
    return book;
}

@RequestMapping(value ="/book3", produces =MediaType.APPLICATION_JSON_VALUE )
public ResponseEntity<Book> bookInfo3() {
    Book book = new Book();
    book.setBookName("Ramayan");
    book.setWriter("Valmiki");
    return ResponseEntity.accepted().body(book);
}

Для более подробной информации обратитесь к этому: http://www.concretepage.com/spring-4/spring-4-mvc-jsonp-example-with-rest-responsebody-responseentity

Ответ 4

Его можно вернуть ResponseEntity без использования дженериков, например,

public ResponseEntity method() {
    boolean isValid = // some logic
    if (isValid){
        return new ResponseEntity(new Success(), HttpStatus.OK);
    }
    else{
        return new ResponseEntity(new Error(), HttpStatus.BAD_REQUEST);
    }
}

Ответ 5

Вот как это сделать:

public ResponseEntity < ? extends BaseResponse > message(@PathVariable String player) { //REST Endpoint.

 try {
  Integer.parseInt(player);
  return new ResponseEntity < ErrorResponse > (new ErrorResponse("111", "player is not found"), HttpStatus.BAD_REQUEST);
 } catch (Exception e) {


 }
 Message msg = new Message(player, "Hello " + player);
 return new ResponseEntity < Message > (msg, HttpStatus.OK);

}

@RequestMapping(value = "/getAll/{player}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity < List < ? extends BaseResponse >> messageAll(@PathVariable String player) { //REST Endpoint.

 try {
  Integer.parseInt(player);
  List < ErrorResponse > errs = new ArrayList < ErrorResponse > ();
  errs.add(new ErrorResponse("111", "player is not found"));
  return new ResponseEntity < List < ? extends BaseResponse >> (errs, HttpStatus.BAD_REQUEST);
 } catch (Exception e) {


 }
 Message msg = new Message(player, "Hello " + player);
 List < Message > msgList = new ArrayList < Message > ();
 msgList.add(msg);
 return new ResponseEntity < List < ? extends BaseResponse >> (msgList, HttpStatus.OK);

}

Ответ 6

Раньше я использовал такой класс. StatusCode устанавливается, когда возникает ошибка с сообщением об ошибке, установленном в сообщении. Данные сохраняются либо на карте, либо в списке, когда это необходимо.

/**
* 
*/
package com.test.presentation.response;

import java.util.Collection;
import java.util.Map;

/**
 * A simple POJO to send JSON response to ajax requests. This POJO enables  us to
 * send messages and error codes with the actual objects in the application.
 * 
 * 
 */
@SuppressWarnings("rawtypes")
public class GenericResponse {

/**
 * An array that contains the actual objects
 */
private Collection rows;

/**
 * An Map that contains the actual objects
 */
private Map mapData;

/**
 * A String containing error code. Set to 1 if there is an error
 */
private int statusCode = 0;

/**
 * A String containing error message.
 */
private String message;

/**
 * An array that contains the actual objects
 * 
 * @return the rows
 */
public Collection getRows() {
    return rows;
}

/**
 * An array that contains the actual objects
 * 
 * @param rows
 *            the rows to set
 */
public void setRows(Collection rows) {
    this.rows = rows;
}

/**
 * An Map that contains the actual objects
 * 
 * @return the mapData
 */
public Map getMapData() {
    return mapData;
}

/**
 * An Map that contains the actual objects
 * 
 * @param mapData
 *            the mapData to set
 */
public void setMapData(Map mapData) {
    this.mapData = mapData;
}

/**
 * A String containing error code.
 * 
 * @return the errorCode
 */
public int getStatusCode() {
    return statusCode;
}

/**
 * A String containing error code.
 * 
 * @param errorCode
 *            the errorCode to set
 */
public void setStatusCode(int errorCode) {
    this.statusCode = errorCode;
}

/**
 * A String containing error message.
 * 
 * @return the errorMessage
 */
public String getMessage() {
    return message;
}

/**
 * A String containing error message.
 * 
 * @param errorMessage
 *            the errorMessage to set
 */
public void setMessage(String errorMessage) {
    this.message = errorMessage;
}

}

Надеюсь это поможет.

Ответ 7

Вы также можете реализовать это, чтобы вернуть Success and Error в один и тот же метод сопоставления запросов, использовать класс Object (класс родителя для каждого класса в java): -

public ResponseEntity< Object> method() {                                                                                                                                                                                                                                                                                                                                                                                  
    boolean b = //  logic  here   
      if (b)  
        return new ResponseEntity< Object>(HttpStatus.OK);      
    else      
        return new ResponseEntity< Object>(HttpStatus.CONFLICT); //appropriate error code   
}

Ответ 8

Вы можете использовать карту с вашим объектом или строкой, как показано ниже:

@RequestMapping(value = "/path", 
        method = RequestMethod.GET, 
        produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public ResponseEntity<Map<String,String>> getData(){

    Map<String,String> response = new HashMap<String, String>();

    boolean isValid = // some logic
    if (isValid){
        response.put("ok", "success saving data");
        return ResponseEntity.accepted().body(response);
    }
    else{
        response.put("error", "an error expected on processing file");
        return ResponseEntity.badRequest().body(response);
    }

}