Jersey / JAXB XML验证错误的自定义错误消息

时间:2011-12-22 20:32:00

标签: jaxb jersey glassfish-3

所以我在Jersey上设置了REST服务。

我的POJO只是注释为@XmlRootElement

我向我的REST服务发送POST请求,一切正常。

1-我向服务发送格式错误的XML我收回容器默认的400 Bad Request页面。使用Glassfish 3我记不起来了,但我知道我可以更改或告诉我的网络应用程序映射到我自己的400错误请求吗?我在哪里可以查找有关该特定主题的文档。

2-我发送有效的XML,但在其中一个预期的字段中,我将空值。我的服务尝试做某事,并抛出持久性异常。我收回容器默认的500内部服务器错误页面,它列出了抛出的异常。我想我也可以映射到我自己的自定义错误页面,但我不只是想显示异常消息。这被认为是一个安全问题。

我基本上想根据我的业务逻辑自行验证字段,然后向客户端返回一条错误消息,例如“Field1无效”,更不用说了。并且客户端应该能够解析错误代码并且还知道哪个字段是错误的。

当我的服务有多种类型的错误请求错误时,我该怎么办?例如,该字段可以预期INT值介于1-3之间,但特定业务请求期望值为2且发送3。

因此,对于类型/值验证,我想简单地说“此处的字段名称无效”。但对于特定的业务逻辑,例如“无效帐户”或“帐户已过期”或“地址不匹配”等...

或者当我有超过1个成功代码时怎么样?

基本上我正在使用旧的“xml”类型服务并转换为REST样式以进行概念验证并将其提升到标准。旧的即使在“查询结果时也是100%POST。即:GET。所以基本上你向它发送XML,它读取XML,调用业务逻辑,逻辑返回XML响应中的相应代码。所以一切都是HTTP 200 OK和业务逻辑代码在XML响应中返回。因此,客户端获得500错误的唯一时间是当服务无法产生XML响应的硬故障时。即使是无效的XML也会返回为200 OK ,但XML响应表明我自己的错误代码。

前段时间我被建议我使用SOAP来获得更多“面向消息”的服务,但是我仍然认为它很重,我可以用REST实现我的服务功能,即使我不需要大部分的REST? / p>

1 个答案:

答案 0 :(得分:3)

您可以使用ExceptionMappers将异常映射到HTTP响应 - 请参阅: http://jersey.java.net/nonav/documentation/1.11/jax-rs.html#d4e433 http://jsr311.java.net/nonav/releases/1.1/javax/ws/rs/ext/ExceptionMapper.html

如果你想在请求到达资源方法之前进行验证,你可以尝试为此编写一个ContainerRequestFilter并抛出一个WebApplicationException,它将Response作为参数 - jersey自动将该异常映射到响应它用。初始化。