java.lang.IllegalArgumentException: интерфейс org.jboss.seam.persistence.EntityManagerProxy не отображается в загрузчике классов - PullRequest
1 голос
/ 14 февраля 2011

Я столкнулся с довольно странной ошибкой, которую не могу понять. Короче говоря: у меня есть ImporterBean, который должен прочитать XML-файл, а затем делать вещи. Этот ImporterBean "запускается" ImporterKicker, но когда я запускаю приложение ApplicationBean и EntityManager в классе ImporterBean равны нулю. Они есть не вводится в этот боб. В KickerBean ImporterBean и ApplicationBean вводятся правильно.

См. Код ниже и, пожалуйста, скажите мне, что я делаю неправильно (используя шов SEAM 2.2.1.CR2).

@SuppressWarnings({"UnusedDeclaration"})
@Name("importerBean")
@AutoCreate
public class ImporterBean {

private static final FilenameFilter ONLY_XML_FILES = (FilenameFilter) new SuffixFileFilter(".xml");
public static final String IN_DIR = "IN";
public static final String ERROR_DIR = "ERROR";
public static final String PROCESSED_DIR = "PROCESSED";

@In(create = true)
public ApplicationBean applicationBean;

@In
private EntityManager entityManager;


@Asynchronous
@Transactional
public void runImport(@Duration long firstStart, @IntervalDuration long startTimer) {
    log.info("<118100>");
    File inDir = Doing some file stuff...
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * Inner class bean to kick the background tasks.
 */
@Startup
@Scope(APPLICATION)
@Name("importerKicker")
public static class ImporterKicker {


    @In(create = true)
    public ImporterBean importerBean;

    @In(create = true)
    public ApplicationBean applicationBean;

    @Create
    public void scheduleOptimizer() {
        final int interval = applicationBean.getImporter118checkInterval();
        if (interval != 0) {

            importerBean.runImport(30 * MILLIS_PER_SECOND, interval * MILLIS_PER_SECOND);
        } else {
        }
    }

}

}

Ответы [ 2 ]

1 голос
/ 28 марта 2011
0 голосов
/ 14 февраля 2011

Поскольку вы используете асинхронный вызов, вы не можете использовать подобные инъекции в компоненте с областью события.

Вместо этого внутри метода Asyncrhonous напишите:

@Asynchronous
@Transactional
public void runImport(@Duration long firstStart, @IntervalDuration long startTimer) {
    EntityManager entityManager = (EntityManager) Component.getInstance("entityManager");
    ApplicationBean applicationBean = (ApplicationBean) Component.getInstance("applicationBean",true);
    log.info("<118100>");
    File inDir = Doing some file stuff...
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
...