【问题标题】:Migration from singletone to java ee injection从单例迁移到 java ee 注入
【发布时间】:2014-12-24 19:22:55
【问题描述】:

我有 Jboss AS 6.1 和 war 和 sar 应用程序。我用卡桑德拉。所以我需要管理人员访问数据库并缓存数据库对象以便快速访问。 所以我是这样做的:

    public class AsaBlackSubsManager extends OperatorsCache<AsaBlackSubs> {
    private final static Logger log = Logger.getLogger(AsaBlackSubsManager.class);
    private final static String CF_NAME = "asa_black_subs";
    private static AsaBlackSubsManager instance = null;
    private MsisdnManager msisdnManager;

    private AsaBlackSubsManager() {
        reload();
        msisdnManager = new MsisdnManager();
    }

    public static AsaBlackSubsManager getInstance() {
        if (instance == null) {
            instance = new AsaBlackSubsManager();
        }
        return instance;
    }

    public List<AsaBlackSubs> list() {
        final List<AsaBlackSubs> list = new ArrayList<>();
        final Statement query = QueryBuilder.select().from(CF_NAME);
        final ResultSet rows = BasicManager.getInstance().getSession().execute(query);
        for (final Row row : rows) {
            if (row != null && row.getString("name") != null) {
                final AsaBlackSubs subs = new AsaBlackSubs();
                subs.setId(row.getUUID("id").toString());
                subs.setName(row.getString("name"));
                subs.setOperatorId(row.getString("operatorId"));
                subs.setParams(row.getString("params"));
                subs.setDescription(row.getString("description"));
                subs.setParentId(row.getString("parentId"));
                subs.setOwner(row.getString("owner"));
                list.add(subs);
            }
        }
        Collections.sort(list, new HierarchyObjectComparator());
        return list;
    }

    public String create(final AsaBlackSubs subs) {
        if (subs.getId() == null) {
            final UUID uuid = UUID.randomUUID();
            subs.setId(uuid.toString());
        }
        final Insert query = QueryBuilder.insertInto(CF_NAME)
                .value("id", UUID.fromString(subs.getId()))
                .value("name", subs.getName())
                .value("operatorId", subs.getOperatorId())
                .value("params", subs.getParams())
                .value("description", subs.getDescription())
                .value("owner", subs.getOwner())
                .value("parentId", subs.getParentId());
        BasicManager.getInstance().getSession().execute(query);
        reload();
        return subs.getId();
    }

}

我还有一个抽象缓存类,我的对象被缓存并按运算符排序。

public abstract class OperatorsCache<T extends OperatoredObject> {

    protected List<T> cache;
    protected Map<String, List<T>> mapByOperator;

    public abstract List<T> list();

    public void reload() {
        cache = new CopyOnWriteArrayList<>(list());
        mapByOperator = cache.parallelStream()
                .collect(Collectors.groupingBy(OperatoredObject::getOperatorId));
    }

    public List<T> cachedList() {
        return new ArrayList<>(cache);
    }

    public List<T> cachedListByOperator(final String operatorId) {
        return mapByOperator.getOrDefault(operatorId, new ArrayList<>());
    }

    public T get(final String id) {
        final Optional<T> any = cache
                .parallelStream()
                .filter(obj -> obj.getId().equals(id))
                .findAny();
        return any.isPresent() ? any.get() : null;
    }

}

因此,通过这种方式,我可以从战争和 sar 访问我的班级,从任何地方访问,并且缓存将是相同的。此缓存将只有一个对象。经理类本身在 sar 中。 这是一个相当好的方法,但我知道单例的弱点,所以我决定用集成在 Jboss 中的焊接依赖注入替换我的单例。我是这样做的:删除私有构造函数和 getInstance() 方法并添加一个 @ApplicationScope 注释。在我的网络课程中,我只是注释@Inject。像这样:

public class CreateAsaSubsb extends BaseAction {


    @Inject
    AsaBlackSubsManager manager;

    public void perform(final HttpServletRequest request,
                        final HttpServletResponse response, final JSONObject jsonObject) throws ServletException, IOException, JSONException
...

但是当我尝试启动所有这些时,war 应用程序没有启动,并且我有这样的异常: org.jboss.weld.exceptions.DeploymentException: WELD-001408 类型 [AsaBlackSubsManager] 的不满足依赖关系,在注入点 [[field] @Inject 处带有限定符 [@Default]

我这几天一直在寻找答案,但我仍然可以弄清楚:我做错了什么?

【问题讨论】:

    标签: java caching jboss dependency-injection jboss-weld


    【解决方案1】:

    JBoss AS 6 是一个 Java EE 6 应用服务器。根据CDI 1.0 spec(Java EE 6 的一部分),您必须将 beans.xml 文件放入存档中:在 WEB-INF/ 目录中进行战争,在 META-INF/ 目录中进行 jar .

    【讨论】:

    • 我已将 beans.xml 放入 war 和 sar 以及 jar 中的 sar。它没有帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多