【发布时间】:2017-09-29 01:48:29
【问题描述】:
我正在为一个项目创建一些现有服务的 RESTful 版本。当前的应用程序使用带有 jboss 6 服务器的 Hibernate 3,因此我添加的任何新服务都必须在该环境中工作。我决定从一个简单的 GET 请求开始。我设法正确设置了所有内容,并且正在运行我的服务方法。我遇到的问题是,当 Jackson 尝试序列化响应以将其发送回客户端时,我得到了“延迟加载”异常。
我看到的针对此问题的两个最常见的解决方案在这里不起作用。将获取类型更改为 EAGER 可能会破坏我现有的服务。添加注释以忽略导致异常的字段也不起作用,因为客户端需要这些字段。
通常,我对此类问题的解决方案是在服务调用期间“预先加载”客户端所需的集合。不幸的是,这只能在事务中完成。当 Jackson 准备好序列化我的响应时,服务方法已经返回并且事务已经关闭。
有人知道解决此问题的方法吗?杰克逊是否提供了一些“钩子”,可以让我在事务中进行序列化?
更新 这是我的代码的示例:
服务提供商-
@Path("service")
public interface ClientServiceProvider
{
@GET
@Path("web/brand/{id}")
@Produces(MediaType.APPLICATION_JSON)
public abstract Response getBrandWeb(@PathParam("id") Long brandId);
}
服务 bean-
@Stateless(name = "ClientServiceProvider")
@Local(ClientServiceProvider.class)
public class ClientServiceProviderBean implements ClientServiceProvider
{
@Override
public Response getBrandWeb(Long brandId)
{
try
{
Functions.beginTx(tx);
Brand b = entityManager.find(Brand.class, brandId);
if (!b.getSubCollections().isEmpty())
{
b.getSubCollections().size();
}
Response r = null;
if (b != null)
{
r = Response.ok(b).build();
}
else
{
r = Response.serverError().build();
}
Functions.commitTx(tx);
return r;
}
catch (Exception e)
{
return quietRollback(tx, e, Response.class);
}
}
}
【问题讨论】:
-
可能你不记得了,但是你最终找到了适合这个问题的解决方案吗?
-
我从来没有这样做过。我最终还是选择了 DTO。
-
非常感谢您的回复:)
标签: hibernate serialization jackson lazy-loading jboss6.x