JMS序列化程序运行时异常,以抛出400状态代码

时间:2015-09-02 17:33:59

标签: symfony jmsserializerbundle

我正在使用JMS序列化程序,并且有两个字段,签入和签出为具有特定格式的日期时间,如下所示:

/**
 * @var \DateTime
 * @Type("DateTime<'Y-m-d'>")
 * @Assert\Date()
 */
 protected $checkin;

/**
 * @var \DateTime
 * @Type("DateTime<'Y-m-d'>")
 * @Assert\Date()
 */
 protected $checkout;

现在,我想抛出一个400 HTTP状态代码,例如,有人发送无效格式(例如空字符串)。

问题是当JMS Serializer无法从DateHandler中的格式创建日期时间时会抛出RuntimeException,如下所示:

if (false === $datetime) {
    throw new RuntimeException(sprintf('Invalid datetime "%s", expected format %s.', $data, $format));
}

此异常提供500 HTTP状态代码。

此外,还检查了为配置添加异常代码400的可能性,但问题是JMS会在各种不同情况下抛出此类异常。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这听起来像你会使用类似json-schemaPHP implementation)之类的东西来验证用户提交的JSON,而不是依赖于JMS Serializer,正如其名称所暗示的那样,纯粹是为了de /序列化内容而不是验证它。

作为一个停止间隙,您可以尝试/捕获反序列化,然后手动返回400响应,例如

try {
    $deserialized = $serializer->deserialize($content, My\Class, 'json');
} catch (\Exception $e) {
    return new Response($e->getMessage(), 400);
}

虽然这可以解决您的直接问题,但它并不是最好的代码路径。在您的示例中,Symfony正在捕获异常本身(因为它没有被您的代码捕获)并将其转换为500响应,JMS序列化程序本身无法返回400响应。