Fixed #7: Do not allow null for reply object in case of a Request attribute
This commit is contained in:
parent
1ffe837d06
commit
37d55ac71d
@ -3,6 +3,7 @@ using System.Diagnostics;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using RabbitMQ.Client.Framing;
|
using RabbitMQ.Client.Framing;
|
||||||
|
using Tapeti.Annotations;
|
||||||
using Tapeti.Config;
|
using Tapeti.Config;
|
||||||
using Tapeti.Helpers;
|
using Tapeti.Helpers;
|
||||||
|
|
||||||
@ -18,23 +19,30 @@ namespace Tapeti.Default
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
if (!context.Result.Info.ParameterType.IsTypeOrTaskOf(t => t.IsClass, out var isTaskOf, out var actualType))
|
var hasClassResult = context.Result.Info.ParameterType.IsTypeOrTaskOf(t => t.IsClass, out var isTaskOf, out var actualType);
|
||||||
|
|
||||||
|
var request = context.MessageClass?.GetCustomAttribute<RequestAttribute>();
|
||||||
|
var expectedClassResult = request?.Response;
|
||||||
|
|
||||||
|
// Verify the return type matches with the Request attribute of the message class. This is a backwards incompatible change in
|
||||||
|
// Tapeti 1.2: if you just want to publish another message as a result of the incoming message, explicitly call IPublisher.Publish.
|
||||||
|
if (!hasClassResult && expectedClassResult != null || hasClassResult && expectedClassResult != actualType)
|
||||||
|
throw new ArgumentException($"Message handler must return type {expectedClassResult?.FullName ?? "void"} in controller {context.Method.DeclaringType?.FullName}, method {context.Method.Name}, found: {actualType?.FullName ?? "void"}");
|
||||||
|
|
||||||
|
if (!hasClassResult)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (isTaskOf)
|
if (isTaskOf)
|
||||||
{
|
{
|
||||||
var handler = GetType().GetMethod("PublishGenericTaskResult", BindingFlags.NonPublic | BindingFlags.Static)?.MakeGenericMethod(actualType);
|
var handler = GetType().GetMethod("PublishGenericTaskResult", BindingFlags.NonPublic | BindingFlags.Static)?.MakeGenericMethod(actualType);
|
||||||
Debug.Assert(handler != null, nameof(handler) + " != null");
|
Debug.Assert(handler != null, nameof(handler) + " != null");
|
||||||
|
|
||||||
context.Result.SetHandler(async (messageContext, value) =>
|
context.Result.SetHandler(async (messageContext, value) => { await (Task) handler.Invoke(null, new[] {messageContext, value }); });
|
||||||
{
|
|
||||||
await (Task)handler.Invoke(null, new[] { messageContext, value });
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
context.Result.SetHandler((messageContext, value) =>
|
context.Result.SetHandler((messageContext, value) => Reply(value, messageContext));
|
||||||
value == null ? null : Reply(value, messageContext));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -43,13 +51,15 @@ namespace Tapeti.Default
|
|||||||
private static async Task PublishGenericTaskResult<T>(IMessageContext messageContext, object value) where T : class
|
private static async Task PublishGenericTaskResult<T>(IMessageContext messageContext, object value) where T : class
|
||||||
{
|
{
|
||||||
var message = await (Task<T>)value;
|
var message = await (Task<T>)value;
|
||||||
if (message != null)
|
await Reply(message, messageContext);
|
||||||
await Reply(message, messageContext);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Task Reply(object message, IMessageContext messageContext)
|
private static Task Reply(object message, IMessageContext messageContext)
|
||||||
{
|
{
|
||||||
|
if (message == null)
|
||||||
|
throw new ArgumentException("Return value of a request message handler must not be null");
|
||||||
|
|
||||||
var publisher = (IInternalPublisher)messageContext.DependencyResolver.Resolve<IPublisher>();
|
var publisher = (IInternalPublisher)messageContext.DependencyResolver.Resolve<IPublisher>();
|
||||||
var properties = new BasicProperties();
|
var properties = new BasicProperties();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user