微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NET5 JsonPatchDocument.ApplyTo 在添加或替换时抛出

如何解决.NET5 JsonPatchDocument.ApplyTo 在添加或替换时抛出

我的 JsonPatchDocument 对象有问题,它可以从字段中删除值,但不能添加/替换它。

我的控制器代码如下:

[HttpPatch]
[Route("{layersGroupId}")]
public async Task<ActionResult> Patch([FromServices] IMediator mediator,[FromBody] List<Operation<LayerGroup>> operations,Guid layersGroupId,CancellationToken cancellationToken)
{
    await mediator.Send(new PatchLayersGroupCommand
    {
        LayersGroupId = layersGroupId,JsonPatch = new JsonPatchDocument<LayerGroup>(operations,new DefaultContractResolver())
    },cancellationToken);

    return Ok();
}

处理程序中的代码

var layersGroup = await databaseContext.UsersLayersViews
                .Where(x => x.UserId == identity.Current.UserId && x.LayerGroupId == request.LayersGroupId)
                .Select(x => x.LayerGroup)
                .SingleOrDefaultAsync(cancellationToken);

if (layersGroup == null)
    throw new ValidationException(ErrorCode.InvalidId,"Invalid layers group ID");

request.JsonPatch.ApplyTo(layersGroup); // Code throws here

例外是:

Unhandled JsonPatchException caught,none of kNown global handlers Could apply
ExceptionDetail
{HResult: -2146233088,Message: 'The value ''"NewName"'' is invalid for target location.',Source: 'Microsoft.AspNetCore.JsonPatch',StackTrace: '   at Microsoft.AspNetCore.JsonPatch.Internal.ErrorReporter.<>c.<.cctor>b__1_0(JsonPatchError error)
   at Microsoft.AspNetCore.JsonPatch.Adapters.ObjectAdapter.Replace(Operation operation,Object objectToApplyTo)
   at Microsoft.AspNetCore.JsonPatch.Operations.Operation`1.Apply(TModel objectToApplyTo,IObjectAdapter adapter)
   at Microsoft.AspNetCore.JsonPatch.JsonPatchDocument`1.ApplyTo(TModel objectToApplyTo,IObjectAdapter adapter)
   at Microsoft.AspNetCore.JsonPatch.JsonPatchDocument`1.ApplyTo(TModel objectToApplyTo)
   at DHIPL.UrbanTools.GIS.Api.UseCases.Groups.Put.RenameGroup.RenameLayersGroupCommandHandler.Handle(RenameLayersGroupCommand request,CancellationToken cancellationToken) in C:\Users\msty\source\repos\urban-tools-backend\src\Services\GIS\GIS.Api\UseCases\Groups\Put\RenameGroup\RenameLayersGroupCommandHandler.cs:line 36
   at DHIPL.Core.Api.Behaviors.ValidatorBehavior`2.Handle(TRequest request,CancellationToken cancellationToken,RequestHandlerDelegate`1 next) in C:\Users\msty\source\repos\urban-tools-backend\src\Packages\DHIPL.Core.Api\Behaviors\ValidatorBehavior.cs:line 31
   at DHIPL.Core.Api.Behaviors.TransactionBehavior`2.<>c__displayClass0_0.<<Handle>b__0>d.MoveNext() in C:\Users\msty\source\repos\urban-tools-backend\src\Packages\DHIPL.Core.Api\Behaviors\TransactionBehavior.cs:line 14
--- End of stack trace from prevIoUs location ---
   at DHIPL.Core.Transactions.TransactionHelper.Wrap[TResult](Func`1 action) in C:\Users\msty\source\repos\urban-tools-backend\src\Packages\DHIPL.Core\Transactions\TransactionHelper.cs:line 51
   at DHIPL.Core.Api.Behaviors.TransactionBehavior`2.Handle(TRequest request,RequestHandlerDelegate`1 next) in C:\Users\msty\source\repos\urban-tools-backend\src\Packages\DHIPL.Core.Api\Behaviors\TransactionBehavior.cs:line 14
   at DHIPL.Core.Api.Behaviors.LoggingBehavior`2.Handle(TRequest request,RequestHandlerDelegate`1 next) in C:\Users\msty\source\repos\urban-tools-backend\src\Packages\DHIPL.Core.Api\Behaviors\LoggingBehavior.cs:line 32
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request,RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestExceptionProcessorBehavior`2.Handle(TRequest request,RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestExceptionActionProcessorBehavior`2.Handle(TRequest request,RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestPostProcessorBehavior`2.Handle(TRequest request,RequestHandlerDelegate`1 next)
   at MediatR.Pipeline.RequestPreProcessorBehavior`2.Handle(TRequest request,RequestHandlerDelegate`1 next)
   at DHIPL.UrbanTools.GIS.Api.Controllers.GroupController.PutRename(IMediator mediator,List`1 operations,CancellationToken cancellationToken) in C:\Users\msty\source\repos\urban-tools-backend\src\Services\GIS\GIS.Api\Controllers\GroupController.cs:line 41
   at lambda_method668(Closure,Object )
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper,ObjectMethodExecutor executor,Object controller,Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker,ValueTask`1 actionResultValueTask)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterasync>g__Awaited|10_0(ControllerActionInvoker invoker,Task lastTask,State next,Scope scope,Object state,Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next,Scope& scope,Object& state,Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterasync>g__Awaited|13_0(ControllerActionInvoker invoker,Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker,Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker,Task task,Idisposable scope)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint,Task requestTask,ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at DHIPL.Core.Api.Exceptions.CoreExceptionMiddleware.Invoke(HttpContext context) in C:\Users\msty\source\repos\urban-tools-backend\src\Packages\DHIPL.Core.Api\Exceptions\CoreExceptionMiddleware.cs:line 30',FailedOperation: {…},Affectedobject: {…},Type: 'Microsoft.AspNetCore.JsonPatch.Exceptions.JsonPatchException'}

互联网上没有关于此错误的单一帖子。我现在很困惑。以前有人遇到过这样的问题吗?如何解决

以防万一,PatchLayersGroupCommand 里面有这些数据:

{
  
LayersGroupId: 'c36bb6c1-4be2-44b9-9239-d7e41d10ebaa',JsonPatch: {
    
Operations: [
      
{
        
value: {
          
ValueKind: 'String',_typeTag: 'JsonElement'
        },OperationType: 'Replace',path: '/GroupName',op: 'replace',from: null,_typeTag: 'Operation`1'
      }
    ],ContractResolver: {
      
DynamicCodeGeneration: false,DefaultMembeRSSearchFlags: 'Instance,Public',SerializeCompilerGeneratedMembers: false,IgnoreSerializableInterface: false,IgnoreSerializableAttribute: true,IgnoreIsspecifiedMembers: false,IgnoreShouldSerializeMembers: false,NamingStrategy: null,_typeTag: 'DefaultContractResolver'
    },_typeTag: 'JsonPatchDocument`1'
  },_typeTag: 'RenameLayersGroupCommand'
}

解决方法

使用 JsonPatch 包启用对 Microsoft.AspNetCore.Mvc.NewtonsoftJson 的支持。要启用此功能,应用必须:

安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet 包。

更新项目的 Startup.ConfigureServices 方法以包含对 AddNewtonsoftJson 的调用:

services
    .AddControllers()
    .AddNewtonsoftJson();

将它添加到服务后,直接从 body 中取出 JsonPatchDocument<T>,不要自己创建。 JsonPatch 现在应该可以工作了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?