InstanceLoaderImpl的load方法有点问题

7.2.9的代码如下:

public void load() {
        if (container == null)
            throw new IllegalStateException("container is null");

        E entity;

        LoadContext<E> loadContext = createLoadContext();

        if (delegate == null) {
            if (!needLoad())
                return;

            if (!sendPreLoadEvent(loadContext)) {
                return;
            }

            entity = getDataManager().load(loadContext);

            if (entity == null) {
                throw new EntityAccessException(container.getEntityMetaClass(), entityId);
            }
        } else {
            if (!sendPreLoadEvent(loadContext)) {
                return;
            }
            entity = delegate.apply(createLoadContext());
        }

        if (dataContext != null) {
            entity = dataContext.merge(entity, new MergeOptions().setFresh(true));
        }
        container.setItem(entity);

        sendPostLoadEvent(entity);
    }

当没有实现delegate的时候,也就是delegate 为null的时候,有一个判断if (!needLoad())来退出,而当开发人员实现自己的 delegate的时候没有办法return,如果在delegate返回一个null的时候,进入下面的代码则会异常:

        if (dataContext != null) {
            entity = dataContext.merge(entity, new MergeOptions().setFresh(true));
        }

这个地方更加合理的写法应该是

        if (dataContext != null && entity!=null) {
            entity = dataContext.merge(entity, new MergeOptions().setFresh(true));
        }

这样才避免了自定义的delegate返回null时候的异常。
我在实现一个非持久化的实体的自定义delegate的时候,由于第一次加载的时候是没有数据的,只能返回null,这个时候就异常了。

有道理,手动赞一个!

不过框架设计不可能做到事无巨细、面面俱到,这个也可以不算问题。你完全可以变通处理,比如返回一个带有特殊标记的空实例,在界面上根据这个标记做一些处理。

nice!所有问题都不是问题,都有办法绕开。