小编Jos*_*lez的帖子

Stream API不适用于EclipseLink/Glassfish中延迟加载的集合?

在检测到我的某个Web服务中存在缺陷后,我将错误跟踪到以下单行:

return this.getTemplate().getDomains().stream().anyMatch(domain -> domain.getName().equals(name));
Run Code Online (Sandbox Code Playgroud)

当我肯定地知道域名列表包含一个名称等于提供的域名时,该行返回false name.所以在我搔了一会儿之后,我最终分开整条线来看看发生了什么.我在调试会话中得到以下内容:

调试会话的屏幕截图

请注意以下行:

List<Domain> domains2 = domains.stream().collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

根据调试器,domains是一个包含两个元素的列表.但申请后,.stream().collect(Collectors.toList())我得到一个完全空的名单.如果我错了,请纠正我,但根据我的理解,那应该是身份操作并返回相同的列表(如果我们是严格的话,还是它的副本).那么这里发生了什么?

在你问之前:不,我根本没有操纵过截图.

为了将其置于上下文中,此代码在有状态请求范围EJB中使用JPA管理实体执行,并在扩展持久性上下文中具有字段访问权限.在这里,您可以获得与手头问题相关的代码的一些部分:

@Stateful
@RequestScoped
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class DomainResources {
    @PersistenceContext(type = PersistenceContextType.EXTENDED) @RequestScoped
    private EntityManager entityManager;

    public boolean templateContainsDomainWithName(String name) { // Extra code included to diagnose the problem
        MetadataTemplate template = this.getTemplate();
        List<Domain> domains = template.getDomains();
        List<Domain> domains2 = domains.stream().collect(Collectors.toList());
        List<String> names = domains.stream().map(Domain::getName).collect(Collectors.toList());
        boolean exists1 = names.contains(name);
        boolean exists2 = this.getTemplate().getDomains().stream().anyMatch(domain -> domain.getName().equals(name));
        return this.getTemplate().getDomains().stream().anyMatch(domain -> domain.getName().equals(name));
    } …
Run Code Online (Sandbox Code Playgroud)

java jpa jax-rs java-ee jboss-arquillian

10
推荐指数
1
解决办法
2735
查看次数

标签 统计

java ×1

java-ee ×1

jax-rs ×1

jboss-arquillian ×1

jpa ×1