Skip to content

Commit 6c84601

Browse files
author
Bart Koelman
committed
Added [NoResource] to suppress startup warning
1 parent 16ae780 commit 6c84601

File tree

7 files changed

+48
-2
lines changed

7 files changed

+48
-2
lines changed

src/JsonApiDotNetCore/Configuration/ResourceGraphBuilder.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,11 @@ public ResourceGraphBuilder Add(Type resourceClrType, Type? idClrType = null, st
139139
}
140140
else
141141
{
142-
_logger.LogWarning($"Skipping: Type '{resourceClrType}' does not implement '{nameof(IIdentifiable)}'.");
142+
if (resourceClrType.GetCustomAttribute<NoResourceAttribute>() == null)
143+
{
144+
_logger.LogWarning(
145+
$"Skipping: Type '{resourceClrType}' does not implement '{nameof(IIdentifiable)}'. Add [NoResource] to suppress this warning.");
146+
}
143147
}
144148

145149
return this;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using JetBrains.Annotations;
2+
3+
namespace JsonApiDotNetCore.Resources.Annotations;
4+
5+
/// <summary>
6+
/// When put on an Entity Framework Core entity, indicates that the type should not be added to the resource graph. This effectively suppresses the
7+
/// warning at startup that this type does not implement <see cref="IIdentifiable" /> .
8+
/// </summary>
9+
[PublicAPI]
10+
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
11+
public sealed class NoResourceAttribute : Attribute
12+
{
13+
}

test/JsonApiDotNetCoreTests/IntegrationTests/EagerLoading/Door.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using JetBrains.Annotations;
2+
using JsonApiDotNetCore.Resources.Annotations;
23

34
namespace JsonApiDotNetCoreTests.IntegrationTests.EagerLoading;
45

56
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
7+
[NoResource]
68
public sealed class Door
79
{
810
public int Id { get; set; }

test/JsonApiDotNetCoreTests/IntegrationTests/EagerLoading/Window.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using JetBrains.Annotations;
2+
using JsonApiDotNetCore.Resources.Annotations;
23

34
namespace JsonApiDotNetCoreTests.IntegrationTests.EagerLoading;
45

56
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
7+
[NoResource]
68
public sealed class Window
79
{
810
public int Id { get; set; }

test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/Messages/OutgoingMessage.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System.Text.Json;
22
using JetBrains.Annotations;
3+
using JsonApiDotNetCore.Resources.Annotations;
34

45
namespace JsonApiDotNetCoreTests.IntegrationTests.Microservices.Messages;
56

67
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
8+
[NoResource]
79
public sealed class OutgoingMessage
810
{
911
public long Id { get; set; }

test/JsonApiDotNetCoreTests/IntegrationTests/ReadWrite/WorkItemToWorkItem.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using JetBrains.Annotations;
2+
using JsonApiDotNetCore.Resources.Annotations;
23

34
namespace JsonApiDotNetCoreTests.IntegrationTests.ReadWrite;
45

56
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
7+
[NoResource]
68
public sealed class WorkItemToWorkItem
79
{
810
public WorkItem FromItem { get; set; } = null!;

test/JsonApiDotNetCoreTests/UnitTests/ResourceGraph/ResourceGraphBuilderTests.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,22 @@ public void Logs_warning_when_adding_non_resource_type()
213213

214214
FakeLoggerFactory.FakeLogMessage message = loggerFactory.Logger.Messages.ElementAt(0);
215215
message.LogLevel.Should().Be(LogLevel.Warning);
216-
message.Text.Should().Be($"Skipping: Type '{typeof(NonResource)}' does not implement 'IIdentifiable'.");
216+
message.Text.Should().Be($"Skipping: Type '{typeof(NonResource)}' does not implement 'IIdentifiable'. Add [NoResource] to suppress this warning.");
217+
}
218+
219+
[Fact]
220+
public void Logs_no_warning_when_adding_non_resource_type_with_suppression()
221+
{
222+
// Arrange
223+
var options = new JsonApiOptions();
224+
var loggerFactory = new FakeLoggerFactory(LogLevel.Warning);
225+
var builder = new ResourceGraphBuilder(options, loggerFactory);
226+
227+
// Act
228+
builder.Add(typeof(NonResourceWithSuppression));
229+
230+
// Assert
231+
loggerFactory.Logger.Messages.Should().BeEmpty();
217232
}
218233

219234
[Fact]
@@ -342,6 +357,12 @@ private sealed class NonResource
342357
{
343358
}
344359

360+
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
361+
[NoResource]
362+
private sealed class NonResourceWithSuppression
363+
{
364+
}
365+
345366
// ReSharper disable once ClassCanBeSealed.Global
346367
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
347368
public class ResourceOfInt32 : Identifiable<int>

0 commit comments

Comments
 (0)