【问题标题】:JMS serializer runtime exception to throw 400 status codeJMS 序列化程序运行时异常抛出 400 状态码
【发布时间】:2015-11-28 08:17:03
【问题描述】:

我正在使用 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 在广泛的不同情况下抛出这种类型的异常。

提前致谢!

【问题讨论】:

    标签: symfony jmsserializerbundle


    【解决方案1】:

    这听起来像是一种情况,您可以使用 json-schema (PHP implementation) 之类的东西来验证用户提交的 JSON,而不是依赖于 JMS Serializer,顾名思义,JMS Serializer 纯粹用于反序列化内容而不是而不是验证它。

    作为权宜之计,您可以围绕反序列化进行尝试/捕获,然后手动返回 400 响应,例如

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

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

    【讨论】:

    • 好点。在反序列化内容之前使用 json-schema 进行验证。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多