0

Deltaspike (1.4.0) と Quartz (2.2.1) を使用してジョブをスケジュールしています。TestJob Bean では、ResourceBundle が注入されます。ResourceBundle のプロデューサーには、facesContext が必要ですが、これは常に null です。

スケジューラ Bean に適切に ResourceBundle を注入するにはどうすればよいですか? @Scheduled を使用すると、facesContext が常に null になるのはなぜですか?

@Scheduled(cronExpression = "0 0/1 * * * ?")
public class TestJob implements Job {

    @Inject private EntityManager em;
    @Inject private transient ResourceBundle i18n;

    public TestJob() {}

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("TestJob executed...");
    }
}

ResourceBundle プロデューサー

public class ResourceBundleProducer implements Serializable {
    @Inject public FacesContext facesContext;

    @Produces
    public ResourceBundle getResourceBundle() {
       if (facesContext.getViewRoot() != null) 
          return ResourceBundle.getBundle("i18n.i18n", facesContext.getViewRoot().getLocale());
       else
          return ResourceBundle.getBundle("i18n.i18n", facesContext.getApplication().getViewHandler().calculateLocale(facesContext));
    }
}

FacesContext プロデューサー

public class FacesContextProducer implements Serializable {
    @Produces
    @RequestScoped
    public FacesContext produceFacesContext() {
        return FacesContext.getCurrentInstance();
    }
}
4

1 に答える 1

0

いくつかの追加構成でサポートされている JSF コンテナーをモックする必要があります。

たとえば、http://deltaspike.apache.org/documentation/test-control.html#JSF(viaMyFaces-Test)を参照してください。

OS890 が提供する例も参照してください: https://github.com/os890/ee6-ds-demo/blob/master/src/test/java/org/os890/demo/ee6/test/PageBeanTest.java

または、test-classpath で ResourceBundleProducer の特殊化された Bean (@Specializes を参照) を提供し、FacesContext に基づいていないロジックを使用します。

メーリングリストでそのような質問をすると、ささいな答えがすぐに得られます。

于 2015-06-27T22:57:15.553 に答える