如何在RestTemplate中处理响应代码而不捕获异常? [春季靴]

时间:2019-04-19 09:15:35

标签: spring spring-boot resttemplate

我正在将响应发送到另一个Web服务以创建用户。如果用户已经存在,则发送回409响应。我像这样使用RestTemplate:

    @PostMapping("/todos/{toDoNoteId}/users")
    public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{

        RestTemplate restTemplate = new RestTemplate();
        final String uri = "http://friend:5000/users";

        try {
            ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class); 
            return result;
        }
        catch (HttpClientErrorException ex) {
            return ResponseEntity.status(ex.getRawStatusCode()).headers(ex.getResponseHeaders())
                    .body(ex.getResponseBodyAsString());

        }
    }

虽然捕获异常在某种程度上是可行的(在catch块中我可以访问状态代码和主体),但是有一种方法可以在没有异常的情况下访问它,例如:

    @PostMapping("/todos/{toDoNoteId}/users")
    public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{

        RestTemplate restTemplate = new RestTemplate();
        final String uri = "http://friend:5000/users";


            ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class); 
            if(result.getStatusCode()=="409"){
            // do something
            }
            else{
            // do something else
            }
            return result;

   }

2 个答案:

答案 0 :(得分:0)

您是否检查过ExceptionHandler?当引发异常时,ExceptionHandler对其进行处理。

例如:

@ControllerAdvice()
public class CustomExceptionHandler {
   private static final Logger logger = LogManager.getLogger("CustomExceptionHandler");

   @ExceptionHandler(YourException.class)
   public ResponseEntity handleYourException(HttpServletRequest request, YourException ex) {
       return ResponseEntity.ok("");
   }

   @ExceptionHandler(Exception.class)
   public ResponseEntity handleException(HttpServletRequest request, Exception ex) {
       logExp("Exception", request, ex);
       //return new ResponseEntity<>();
       return null;
   }
}

答案 1 :(得分:0)

您可以创建自己的自定义resttemplate并定义异常处理程序。这是一个代码段。

@Configuration
public class CustomRestTemplate extends RestTemplate {
    @Autowired
    private CustomErrorHandler customErrorHandler;

    @PostConstruct
    public void init() {
        this.setErrorHandler(customErrorHandler);
    }
}


@Component
public class CustomErrorHandler implements ResponseErrorHandler {
    @Override
    public boolean hasError(ClientHttpResponse response) throws IOException {
      if(response.getStatusCode() != "409"){
       return true;
      }else {
       return false;
      }
    }

   @Override
    public void handleError(ClientHttpResponse response) throws IOException {
      String responseBody = response.getBody();//Pls read from InputStream and create write into String


            JSONObject jsonObj = new JSONObject(result);
            JSONArray jsonArray = new JSONArray();

            jsonObj.put("status", response.getStatusCode());
            jsonObj.put("body", responseBody );
            jsonArray.put(jsonObj);

            responseString = jsonArray.get(0).toString();


      throw new MyException(responseString );

   }

}

class MyException throw RuntimeException {
   public MyException (String message) {
        super(message);
    }

}

因此,您的课程将更改为

 @PostMapping("/todos/{toDoNoteId}/users")
    public ResponseEntity <String> postUser(@RequestBody User user, @PathVariable int toDoNoteId, UriComponentsBuilder builder)throws HttpMessageNotReadableException, ParseException{

        CustomRestTemplate restTemplate = new CustomRestTemplate ();
        final String uri = "http://friend:5000/users";

        ResponseEntity<String> result = restTemplate.postForEntity(uri, user, String.class); 
        return result       
    }