使用Argument Resolver反序列化请求得到空UpdateAreaModes对象,求解决
问题原因与解决方案
问题根源
你的请求JSON是直接的数组结构:
[{"type": "SomeType", "value": "someValue"}]
但你要反序列化的UpdateAreaModes类是一个包含modes数组字段的对象,序列化器期望的JSON结构应该是对象格式:
{ "modes": [{"type": "SomeType", "value": "someValue"}] }
两者结构不匹配,导致序列化器无法将请求的数组内容映射到UpdateAreaModes的modes属性,最终得到空对象。
解决方案
有两种可行处理方式,按需选择:
方式一:调整请求JSON结构
将请求内容修改为符合UpdateAreaModes结构的对象格式,这样你现有的Argument Resolver代码就能正常工作。
方式二:修改Argument Resolver的反序列化逻辑
如果无法修改请求结构,可在Resolver里手动适配结构后再反序列化:
public function resolve(Request $request, ArgumentMetadata $argument): iterable { // 把请求数组包装成包含modes字段的对象结构 $wrappedData = [ 'modes' => json_decode($request->getContent(), true) ]; yield $this->serializer->deserialize(json_encode($wrappedData), UpdateAreaModes::class, BaseResolver::JSON); }
或者直接分步反序列化并构建对象:
public function resolve(Request $request, ArgumentMetadata $argument): iterable { // 先把请求数组反序列化为ModeDTO数组 $modeDTOs = $this->serializer->deserialize( $request->getContent(), 'array<ModeDTO>', BaseResolver::JSON ); // 手动构建UpdateAreaModes对象并赋值 $updateAreaModes = new UpdateAreaModes(); $updateAreaModes->modes = $modeDTOs; yield $updateAreaModes; }
额外注意:确保你的序列化器(如Symfony Serializer)已正确配置DTO支持,比如启用PropertyInfo组件识别属性类型,或通过注解明确字段映射。
内容的提问来源于stack exchange,提问作者Yassine Elhamraoui
相关产品推荐
相关产品推荐

