处理 ResponsesEntity 中的异常 java
Handle Exception in ResponsesEntity java
我想知道如何处理 ResponsesEntity
中的异常。
当它收到错误的 url 时,它应该转到 catch
块并显示 log
。但是我不断在控制台中收到错误消息。 try-catch
不工作,因为它不显示日志消息。
@GetMapping("abc/{Id}")
public ResponseEntity info(@PathVariable("Id") String id) {
HttpEntity httpEntity = new HttpEntity(buildHttpHeaders());
String theUrl = url + "/xxx/transactions/" +id;
ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl, HttpMethod.GET, httpEntity, TDto.class);
TDto tdto = responseEntity.getBody();
Tran tran = new Tran();
try {
tran.setDate(new Date());
tran.saveAndFlush(tran); // save to database
}catch(Exception e)
{
log.info("Log: "+e);
}
return responseEntity;
}
错误
org.springframework.web.client.HttpClientErrorException: 404 Not Found
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:531)
at com.rh.tranglo.controller.ApiController.retrieveTransactionInfo(ApiController.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
有没有办法通过在 catch
块中显示 log
来处理异常?
尝试在捕获中指定从控制台得到的确切错误,也就是 HttpClientErrorException
您实际上并没有在 try-catch 中包含 responseEntity。 try-catch 将只捕获 try 中的异常 { // 将捕获括号之间的所有异常 }
@GetMapping("abc/{Id}")
public ResponseEntity info(@PathVariable("Id") String id) {
try {
HttpEntity httpEntity = new HttpEntity(buildHttpHeaders());
String theUrl = url + "/xxx/transactions/" +id;
ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl,
HttpMethod.GET, httpEntity, TDto.class);
TDto tdto = responseEntity.getBody();
Tran tran = new Tran();
tran.setDate(new Date());
tran.saveAndFlush(tran); // save to database
}catch(Exception e)
{
log.info("Log: "+e);
}
return responseEntity;
}
如果你想捕获来自 responseEntity 的抛出,它应该看起来更像这样,但在你的情况下,只会捕获由这个抛出的异常:
try {
tran.setDate(new Date()); -> this will throw exceptions(very unlikely)
tran.saveAndFlush(tran); -> or this will throw exceptions,
}
并且不会捕获任何其他异常
如果您的 catch 块没有捕获异常,则意味着您在 try 块中包装了错误的代码。要知道实际上是哪个代码抛出异常,我建议您在代码中放置断点并通过调试器 运行 断点。我不熟悉你想要实现的目标但是看着它我猜你应该在 try 块中包装的语句是这个
ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl, HttpMethod.GET, httpEntity, TDto.class);
此外,如果您再次仔细查看日志,您会发现对您有所帮助的内容。异常源自您的代码,但排名靠前的异常只是 spring 异常。我想如果您按照日志消息向下看,您会在代码中看到抛出异常的行。
更新
我想我现在明白你的问题了。但是你的问题没有被正确地问到。你有一个映射到特定 URL 的控制器说 /hello 但在测试时你通过 /hi 并且你希望你的控制器方法捕获未找到的异常。抱歉 spring 不能那样工作。
当控制器映射到 URL 时,仅当调用中使用的 URL 与控制器映射到的 URL 匹配时,才会执行控制器代码。因此,在您的情况下,当您使用控制器映射到的另一个 URL 进行 GET 时,控制器中的代码将永远不会执行。这就是为什么你不进入你放置的 catch 块。 Spring 代码负责抛出 404 异常,而不是您的代码。
注意当我正确理解您的问题后,我将能够为您提供更多帮助。如果您能分享完整的堆栈跟踪信息,那将大有裨益。
我想知道如何处理 ResponsesEntity
中的异常。
当它收到错误的 url 时,它应该转到 catch
块并显示 log
。但是我不断在控制台中收到错误消息。 try-catch
不工作,因为它不显示日志消息。
@GetMapping("abc/{Id}")
public ResponseEntity info(@PathVariable("Id") String id) {
HttpEntity httpEntity = new HttpEntity(buildHttpHeaders());
String theUrl = url + "/xxx/transactions/" +id;
ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl, HttpMethod.GET, httpEntity, TDto.class);
TDto tdto = responseEntity.getBody();
Tran tran = new Tran();
try {
tran.setDate(new Date());
tran.saveAndFlush(tran); // save to database
}catch(Exception e)
{
log.info("Log: "+e);
}
return responseEntity;
}
错误
org.springframework.web.client.HttpClientErrorException: 404 Not Found
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:63)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:531)
at com.rh.tranglo.controller.ApiController.retrieveTransactionInfo(ApiController.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
有没有办法通过在 catch
块中显示 log
来处理异常?
尝试在捕获中指定从控制台得到的确切错误,也就是 HttpClientErrorException
您实际上并没有在 try-catch 中包含 responseEntity。 try-catch 将只捕获 try 中的异常 { // 将捕获括号之间的所有异常 }
@GetMapping("abc/{Id}")
public ResponseEntity info(@PathVariable("Id") String id) {
try {
HttpEntity httpEntity = new HttpEntity(buildHttpHeaders());
String theUrl = url + "/xxx/transactions/" +id;
ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl,
HttpMethod.GET, httpEntity, TDto.class);
TDto tdto = responseEntity.getBody();
Tran tran = new Tran();
tran.setDate(new Date());
tran.saveAndFlush(tran); // save to database
}catch(Exception e)
{
log.info("Log: "+e);
}
return responseEntity;
}
如果你想捕获来自 responseEntity 的抛出,它应该看起来更像这样,但在你的情况下,只会捕获由这个抛出的异常:
try {
tran.setDate(new Date()); -> this will throw exceptions(very unlikely)
tran.saveAndFlush(tran); -> or this will throw exceptions,
}
并且不会捕获任何其他异常
如果您的 catch 块没有捕获异常,则意味着您在 try 块中包装了错误的代码。要知道实际上是哪个代码抛出异常,我建议您在代码中放置断点并通过调试器 运行 断点。我不熟悉你想要实现的目标但是看着它我猜你应该在 try 块中包装的语句是这个
ResponseEntity<TDto> responseEntity = restTemplate.exchange(theUrl, HttpMethod.GET, httpEntity, TDto.class);
此外,如果您再次仔细查看日志,您会发现对您有所帮助的内容。异常源自您的代码,但排名靠前的异常只是 spring 异常。我想如果您按照日志消息向下看,您会在代码中看到抛出异常的行。
更新
我想我现在明白你的问题了。但是你的问题没有被正确地问到。你有一个映射到特定 URL 的控制器说 /hello 但在测试时你通过 /hi 并且你希望你的控制器方法捕获未找到的异常。抱歉 spring 不能那样工作。
当控制器映射到 URL 时,仅当调用中使用的 URL 与控制器映射到的 URL 匹配时,才会执行控制器代码。因此,在您的情况下,当您使用控制器映射到的另一个 URL 进行 GET 时,控制器中的代码将永远不会执行。这就是为什么你不进入你放置的 catch 块。 Spring 代码负责抛出 404 异常,而不是您的代码。
注意当我正确理解您的问题后,我将能够为您提供更多帮助。如果您能分享完整的堆栈跟踪信息,那将大有裨益。