-
Notifications
You must be signed in to change notification settings - Fork 1.1k
GH-2748: Add bean definition info into exceptions #2986
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Fixes spring-projects#2748 In many cases Spring Integration stack traces doesn't contain any relations to end-user code. Just because a target project code mostly contains only a configuration for out-of-the-box components without any custom code. When exception is thrown from such an out-of-the-box component, it is hard from the stack trace to determine a configuration source for those components. * Add a logic into the `IntegrationObjectSupport` to obtain a its own `BeanDefinition` from the `BeanFactory` to include a `resource` and `source` (if any) into the `toString()` representation, as well as add a new `getBeanDescription()` to get such an info at runtime * The `toString()` is simply used by `this` reference in the message for `MessagingException` thrown from the `IntegrationObjectSupport` implementations * Modify an exception message for the `MessageTransformingHandler` and `MessageFilter` to make it based on `this`. The `AbstractMessageHandler` already includes `this` into its exception message * Modify a `AbstractConsumerEndpointParser` and `AbstractAmqpInboundAdapterParser` (as a sample) to include a `resource` and `source` into a `MessageHandler` `BeanDefinition`. * Include an `IntegrationFlow` `BeanDefinition` `resource` (`@Configuration` class) and its bean method as a `source` into all child beans declared during flow parsing in the `IntegrationFlowBeanPostProcessor` * Add `IntegrationFlowRegistrationBuilder.setSource()` for manually registered flows: there is no configuration parsing phase to extract such an info from `BeanFactory` * Propagate that `source` into all the child beans provided by the `IntegrationFlow` * Modify a `LambdaMessageProcessor` exception message to include a method info in case of `InvocationTargetException`
I would say we can merge it with what we have so far. |
`IntegrationObjectSupport` to avoid tests modifications for mocking directly into `ConfigurableListableBeanFactory`. Use `instanceof` instead in the `getBeanDescription()`
Quite a lot of test failures (travis) |
Yep! Fighting with that... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM; just one minor question/issue.
public void sendTimeoutDefault() { | ||
@Test | ||
// INT-1154 | ||
void sendTimeoutDefault() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
?? Why the newlines on all of these?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like fresh IDEA code formatting...
Thanks for heads up. I will remove it altogether.
to rely on the `NamedComponent` for channel names instead of always call `toString()` which is now much more than just a bean name * Don't describe a `componentName` if it is the same as a `beanName` * Check for parent `BeanDefinition` in the `IntegrationFlowBeanPostProcessor` before calling its meta-info * Fix tests according new `IntegrationObjectSupport.toString()` behavior
Fixes #2748
In many cases Spring Integration stack traces doesn't contain any
relations to end-user code.
Just because a target project code mostly contains only a configuration
for out-of-the-box components without any custom code.
When exception is thrown from such an out-of-the-box component, it is
hard from the stack trace to determine a configuration source for those
components.
IntegrationObjectSupport
to obtain a its ownBeanDefinition
from theBeanFactory
to include aresource
andsource
(if any) into thetoString()
representation, as well as adda new
getBeanDescription()
to get such an info at runtimetoString()
is simply used bythis
reference in the messagefor
MessagingException
thrown from theIntegrationObjectSupport
implementations
MessageTransformingHandler
andMessageFilter
to make it based onthis
.The
AbstractMessageHandler
already includesthis
into its exceptionmessage
AbstractConsumerEndpointParser
andAbstractAmqpInboundAdapterParser
(as a sample) to include aresource
and
source
into aMessageHandler
BeanDefinition
.IntegrationFlow
BeanDefinition
resource
(
@Configuration
class) and its bean method as asource
into allchild beans declared during flow parsing in the
IntegrationFlowBeanPostProcessor
IntegrationFlowRegistrationBuilder.setSource()
for manuallyregistered flows: there is no configuration parsing phase to extract
such an info from
BeanFactory
source
into all the child beans provided by theIntegrationFlow
LambdaMessageProcessor
exception message to include amethod info in case of
InvocationTargetException