Hi Gerhard, I'm having some trouble with this workaround, I can't get it
to compile.
Here's the POM entry for deltaspike-jsf-module-impl
<dependency>
<groupId>org.apache.deltaspike.modules</groupId>
<artifactId>deltaspike-jsf-module-impl</artifactId>
<version>${deltaspike.version}</version>
<scope>compile</scope>
</dependency>
Here's the bean:
package com.app.core;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Specializes;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.apache.deltaspike.core.api.message.MessageContext;
import org.apache.deltaspike.core.impl.message.DefaultMessageResolver;
import org.apache.deltaspike.jsf.impl.message.JsfMessageResolver;
@Specializes
@Dependent
public class CustomJsfMessageResolver extends JsfMessageResolver
{
private static final long serialVersionUID = 1L;
@Override
protected List<String> getMessageSources(MessageContext messageContext)
{
List<String> result = new ArrayList<String>(new
DefaultMessageResolver().getMessageSources(messageContext));
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext == null)
{
return result;
}
try
{
String bundleName =
facesContext.getApplication().getMessageBundle();
if (bundleName != null)
{
result.add(bundleName);
}
result.add(FacesMessage.FACES_MESSAGES); //default messages
from jsf
return result;
}
catch (RuntimeException e)
{
return result;
}
}
}
This is what I'm getting at compilation time:
[ERROR] Failed to execute goal
org.apache.maven.plugins:maven-compiler-plugin:3.3:compile
(default-compile) on project app: Compilation failure
[ERROR]
/D:/dev/projects/app/src/main/java/com/app/core/CustomJsfMessageResolver.java:[23,81]
getMessageSources(org.apache.deltaspike.core.api.message.MessageContext)
has protected access in
org.apache.deltaspike.core.impl.message.DefaultMessageResolver
[ERROR] -> [Help 1]
So the compiler complains about protected access. Is it something I am
doing wrong?
2016-04-27 1:47 GMT-05:00 Juan Pablo <[email protected]>:
> Thanks, I'll let you know as soon as I try it.
>
> 2016-04-27 1:29 GMT-05:00 Gerhard Petracek <[email protected]>:
>
>> hi juan,
>>
>> i've added the workaround in my first comment.
>> once you confirm that it works for you, i'll push a fix (which is similar
>> to the workaround).
>>
>> regards,
>> gerhard
>>
>> http://www.irian.at
>>
>> Your JavaEE powerhouse -
>> JavaEE Consulting, Development and
>> Courses in English and German
>>
>> Professional Support for Apache
>> MyFaces, DeltaSpike and OpenWebBeans
>>
>>
>>
>> 2016-04-27 7:58 GMT+02:00 Juan Pablo <[email protected]>:
>>
>>> Thanks a lot, Gerhard, I just created
>>> https://issues.apache.org/jira/browse/DELTASPIKE-1135. Cheers.
>>>
>>> 2016-04-27 0:48 GMT-05:00 Gerhard Petracek <[email protected]>:
>>>
>>> > hi juan,
>>> >
>>> > InitFacesContext causes the issue outside a http-request.
>>> > (to support your use-case) we need to check for an active request
>>> before
>>> > using FacesContext#getApplication.
>>> > -> please file a jira-ticket (i'll provide a workaround at that
>>> ticket).
>>> >
>>> > regards,
>>> > gerhard
>>> >
>>> > http://www.irian.at
>>> >
>>> > Your JavaEE powerhouse -
>>> > JavaEE Consulting, Development and
>>> > Courses in English and German
>>> >
>>> > Professional Support for Apache
>>> > MyFaces, DeltaSpike and OpenWebBeans
>>> >
>>> >
>>> >
>>> > 2016-04-27 7:34 GMT+02:00 Juan Pablo <[email protected]>:
>>> >
>>> > > Hi. I'm running into a problem when trying to use DS' typesafe
>>> messages
>>> > in
>>> > > a observer method that runs upon initialization of the application
>>> > scope.
>>> > >
>>> > > Code (relevant methods only):
>>> > >
>>> > > @Dependent
>>> > > @MessageBundle
>>> > > // (Messages.properties is has been set-up correctly)
>>> > > public interface Messages {
>>> > >
>>> > > String administrador();
>>> > > }
>>> > >
>>> > > @Dependent
>>> > > public class StartupBean implements Serializable {
>>> > >
>>> > > @Inject
>>> > > private Messages msgs;
>>> > >
>>> > > public void runOnStartup(@Observes
>>> @Initialized(ApplicationScoped.class)
>>> > > ServletContext payload) {
>>> > > this.log.info(this.msgs.administrador());
>>> > > }
>>> > >
>>> > > }
>>> > >
>>> > > When the observer method is executed, I'm being presented with this
>>> > > stacktrace, and deployment of application is aborted:
>>> > >
>>> > > 23:56:34,238 SEVERE [faces] (FactoryFinderInstance.java:177) Unable
>>> to
>>> > > obtain InjectionProvider from init time FacesContext. Does this
>>> container
>>> > > implement the Mojarra Injection SPI?
>>> > > 23:56:34,239 SEVERE [faces] (FactoryFinderInstance.java:494) La
>>> > aplicación
>>> > > no se ha inicializado correctamente durante el inicio, no se
>>> encuentra la
>>> > > fábrica: javax.faces.application.ApplicationFactory. Attempting to
>>> find
>>> > > backup.
>>> > > 23:56:34,239 ERROR [fail] (ServiceControllerImpl.java:1955)
>>> MSC000001:
>>> > > Failed to start service
>>> > > jboss.undertow.deployment.default-server.default-host./hg:
>>> > > org.jboss.msc.service.StartException in service
>>> > > jboss.undertow.deployment.default-server.default-host./hg: Failed to
>>> > start
>>> > > service
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1904)
>>> > > [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
>>> > > at
>>> > >
>>> > >
>>> >
>>> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
>>> > > [rt.jar:1.8.0_77]
>>> > > at
>>> > >
>>> > >
>>> >
>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
>>> > > [rt.jar:1.8.0_77]
>>> > > at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_77]
>>> > > Caused by: java.lang.RuntimeException:
>>> java.lang.IllegalStateException:
>>> > > Could not find backup for factory
>>> > > javax.faces.application.ApplicationFactory.
>>> > > at
>>> > >
>>> > >
>>> >
>>> io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:222)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:87)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.wildfly.extension.undertow.deployment.UndertowDeploymentService.start(UndertowDeploymentService.java:72)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
>>> > > [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
>>> > > [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
>>> > > ... 3 more
>>> > > Caused by: java.lang.IllegalStateException: Could not find backup for
>>> > > factory javax.faces.application.ApplicationFactory.
>>> > > at
>>> > >
>>> > >
>>> >
>>> javax.faces.FactoryFinderInstance.getFactory(FactoryFinderInstance.java:500)
>>> > > at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:287)
>>> > > at
>>> > >
>>> > >
>>> >
>>> com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:142)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.apache.deltaspike.jsf.impl.message.JsfMessageResolver.getMessageSources(JsfMessageResolver.java:45)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.apache.deltaspike.core.impl.message.DefaultMessageResolver.getMessage(DefaultMessageResolver.java:52)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.apache.deltaspike.core.impl.message.DefaultMessage.toString(DefaultMessage.java:115)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.apache.deltaspike.core.impl.message.DefaultMessage.toString(DefaultMessage.java:95)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.apache.deltaspike.core.impl.message.MessageBundleInvocationHandler.invoke(MessageBundleInvocationHandler.java:123)
>>> > > at com.sun.proxy.$Proxy1079.administrador(Unknown Source)
>>> > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> > > [rt.jar:1.8.0_77]
>>> > > at
>>> > >
>>> > >
>>> >
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>>> > > [rt.jar:1.8.0_77]
>>> > > at
>>> > >
>>> > >
>>> >
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>> > > [rt.jar:1.8.0_77]
>>> > > at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_77]
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.weld.proxies.Messages$Serializable$981322000$Proxy$_$$_WeldClientProxy.administrador(Unknown
>>> > > Source)
>>> > > at com.app.core.StartupBean.runOnStartup(StartupBean.java:178)
>>> > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>> > > [rt.jar:1.8.0_77]
>>> > > at
>>> > >
>>> > >
>>> >
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>>> > > [rt.jar:1.8.0_77]
>>> > > at
>>> > >
>>> > >
>>> >
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>> > > [rt.jar:1.8.0_77]
>>> > > at java.lang.reflect.Method.invoke(Method.java:498) [rt.jar:1.8.0_77]
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.weld.injection.MethodInjectionPoint.invokeOnInstanceWithSpecialValue(MethodInjectionPoint.java:90)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:271)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.weld.event.ObserverMethodImpl.sendEvent(ObserverMethodImpl.java:258)
>>> > > at
>>> > >
>>> >
>>> org.jboss.weld.event.ObserverMethodImpl.notify(ObserverMethodImpl.java:237)
>>> > > at org.jboss.weld.event.FastEvent.fire(FastEvent.java:125)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.weld.servlet.HttpContextLifecycle.contextInitialized(HttpContextLifecycle.java:132)
>>> > > at
>>> > >
>>> > >
>>> >
>>> org.jboss.weld.servlet.WeldInitialListener.contextInitialized(WeldInitialListener.java:101)
>>> > > at
>>> > >
>>> > >
>>> >
>>> io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:173)
>>> > > at
>>> > >
>>> > >
>>> >
>>> io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:193)
>>> > > ... 7 more
>>> > >
>>> > > The stacktrace says something about a FacesContext, I thought
>>> messages
>>> > > independent from JSF... Messages work normally in any other
>>> situation,
>>> > even
>>> > > in a RESTful endpoint:
>>> > >
>>> > > @Path("svctest")
>>> > > @RequestScoped
>>> > > public class SvcTest {
>>> > >
>>> > > @Inject
>>> > > private Messages messages;
>>> > >
>>> > > @GET
>>> > > @Path("administrador")
>>> > > public String run() {
>>> > > // look Mom, no FacesContext! ;)
>>> > > return this.messages.administrador();
>>> > > }
>>> > > }
>>> > >
>>> > > Result of invocation:
>>> > >
>>> > > GET HTTP/1.1
>>> http://localhost:8080/app/services/svctest/administrador
>>> > >
>>> > > Administrador
>>> > >
>>> > > What am I doing wrong here? What can I do to run code that needs to
>>> use
>>> > > typesafe messages at application startup? I'm using Java
>>> 1.8.0_77-b03,
>>> > > Wildfly 8.2.0, DeltaSpike 1.6.0 (v1.4.1 has the same issue, updated
>>> to
>>> > > latest to make sure it issue was not caused by an already fixed
>>> bug). If
>>> > > you need additional details please let me know. Thanks for your
>>> > attention.
>>> > >
>>> > >
>>> > > --
>>> > > Atte.
>>> > >
>>> > > Juan Pablo Angamarca
>>> > >
>>> >
>>>
>>>
>>>
>>> --
>>> Atte.
>>>
>>> Juan Pablo Angamarca
>>>
>>
>>
>
>
> --
> Atte.
>
> Juan Pablo Angamarca
>
--
Atte.
Juan Pablo Angamarca