在检测到我的某个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)