如何在不捕获异常的情况下处理RestTemplate中的响应代码? [春靴]

问题描述 投票:0回答:2

我正在向另一个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;

   }
spring spring-boot resttemplate
2个回答
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;
   }
}

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       
    }
© www.soinside.com 2019 - 2024. All rights reserved.