Tomcat 7 EL recognizing Method as Property - jsf-2

I'm trying to run an existing application on Tomcat 7.0.28 using JSF 2.1.10
I have the following bean:
#Named
#Dependent
public class FormatterBean
{
public String replaceNewLineWithBrTag(String s)
{
return Formatter.replaceNewLineWithBrTag(s);
}
public String leftJustifyWithZeros(String string, Integer zeroTotal)
{
return Formatter.leftJustifyWithZeros(string, zeroTotal);
}
}
When I do something like this
<p:tooltip for="visualizar" value="#{formatterBean.replaceNewLineWithBrTag(adiantamento.observacao)}" />
I get the following error:
/page/rdv/adiantamento.xhtml #87,117
value="#{formatterBean.replaceNewLineWithBrTag(adiantamento.observacao)}":
Property 'replaceNewLineWithBrTag' not found on type
br.com.spdata.util.FormatterBean
Some details:
Same code works fine on Glassfish 3.1.2
The method leftJustifyWithZeros works fine
Any ideias?
Thanks,
Phillip

One thing to check is whether your web.xml is declared as using the Servlet 3.0 spec, e.g.:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
>
...

Related

PersitenceContext injection in EJB module in Geronimo 3.0

I'm trying to inject a PersistenceContext using EJB3 annotations but geronimo doesn't inject dependency. It's an EAR project composed by an EJB and a WEB module.
EJB-module configuration
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ejb:openejb-jar
xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0"
xmlns:bp="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0"
xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2"
xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2"
xmlns:jaspi="http://geronimo.apache.org/xml/ns/geronimo-jaspi"
xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0"
xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence"
xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0"
xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
<dep:environment>
<dep:moduleId>
<dep:groupId>wedge</dep:groupId>
<dep:artifactId>wedge-ejb</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>car</dep:type>
</dep:moduleId>
<dep:dependencies>
<dep:dependency>
<dep:groupId>console.dbpool</dep:groupId>
<dep:artifactId>jdbc_wedgeDS</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>car</dep:type>
</dep:dependency>
</dep:dependencies>
</dep:environment>
I've configured persistence.xml as follows
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="wedgePU" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<jta-data-source>jdbc/wedgeDS</jta-data-source>
<class>wedge.entity.Aec</class>
...
<class>wedge.entity.Tnr</class>
<properties>
<property name="openjpa.TransactionMode" value="managed" />
<property name="openjpa.ManagedRuntime"
value="jndi(TransactionManagerName=java:comp/TransactionManager)" />
<property name="openjpa.Log" value="DefaultLevel=INFO" />
</properties>
</persistence-unit>
I've created datasource as Local TX Datasource, and is resolved ok.
I've defined an EJB as follows
#Local(PruebaBL.class)
#Stateless
public class PruebaBLImpl {
#PersistenceContext()
private EntityManager em;
#TransactionAttribute(TransactionAttributeType.REQUIRED)
public void metodoPrueba(HttpServletResponse response) throws IOException, NamingException {
if (em == null) {
response.getOutputStream().println("entity manager is null");
}
I've verified that transaction begins/ends OK, but entityManager is not injected.
Some ideas?
Thanks in advance.
Saul
You don't need to specify the global jndi name. Inject it like this in your servlet:
#EJB
private PruebaBL pruebaBL;

Managed Bean Annotation doesn't work in JSF 2.0

I've encoutered strange issue with annotations in bean.
index.xhtml content:
<h:outputText value="#{ejb.helloWorld}" />
Ejb.java content:
package bean;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
#ManagedBean(name="ejb")
#SessionScoped
public class Ejb implements Serializable
{
public String getHelloWorld()
{
return "Hello World";
}
}
From what we see above i should be able to call bean method... but i can't, it will work only if i manage bean in faces-config.xml file with content:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
<managed-bean>
<managed-bean-name>ejb</managed-bean-name>
<managed-bean-class>bean.Ejb</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
Questions:
Why i have encountered such situation ?
How to resolve this issue ?
I'm using:
JSF 2.0 (imported to lib)
JBoss Server 4.2
My wild guess is that JSF 1.2 bundled by default with JBoss 4.2 is used (JBoss might not care about JSF version). As a result annotations are ignored, faces-config.xml file is used.
Try to use configuration suggested here (thats's google cached page).

Facelet Method call where property required

Is it possible to invoke a method where property is expected in JSF 2.0 Facelet EL. For example:
<h:outputText value="#{pojo.methodName}" />
where pojo is an instance of POJO and methodName is the name of method. An error would be thrown because JSF expects to find getMethodName method.
Before someone asks why one would need this, consider any value we want to display in text which is computed and we don't have required getter method and no source code.
Update after BalusC Answer:
No rename possible because no source code available. methodName() didn't work. The only difference is that in actual code its chained pojo.
<h:outputText value="#{pojo1.pojo2.methodName()}" />
Since other properties are working for pojo2, I assume that its methodName which can not be invoked. Server says "The class does not have the property methodName"
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
Empty faces-config
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
</faces-config>
P.S. environment JBoss 6 and JSF 2
Add parentheses:
<h:outputText value="#{pojo.methodName()}" />
(which only works in EL 2.2, which is part of Java EE 6, so it only works out box in Tomcat 7, Glassfish 3, etc, see also Invoke direct methods or methods with arguments / variables / parameters in EL)
Or just rename the method:
public String getMethodName() {
// ...
}

glassfish 3.1 jdni lookup on EJB3

I have the following Interfaces MyLocalBean, MyRemoteBean and the stateless MyBean implements MyLocalBean, MyRemoteBean
Which of the following i don't need to get a simple java application to test this ...
ejb-jar.xml, glassfish-ejb-jar.xml, gf-client.jar
Here's ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
<enterprise-beans>
<session>
<ejb-name>MyEJB</ejb-name>
<home>test.ejb.MyLocalBean</home>
<remote>test.ejb.MyRemoteBean</remote>
<ejb-class>test.ejb.MyBean </ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
what's missing here? would i be able to lookup using MyEJB?
and here's my lookup code
InitialContext ic;
ic = new InitialContext();
MyRemoteBean remoteBean =
(MyRemoteBean ) ic.lookup("java:comp/env/MyEJB");
[EDIT]
I've update the ejb-jar.xml as follows
<enterprise-beans>
<session>
<ejb-name>MyEJB</ejb-name>
<ejb-class>test.ejb.MyBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>MyEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>test.ejb.MyLocalBean</local>
<ejb-link>MyEJBClient.jar#MyEJB</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
I get an error ...
cannot Deploy MyBeanEAR
Deployment Error for module:
MyBeanEAR: Error occurred
during deployment: Exception while
deploying the app [MyBeanEAR] :
Error: Unresolved :
MyEJBClient.jar#MyEJB.
Please see server.log for more
details.
[\EDIT]
[EDIT]
Hi bkail, let me brake down the problem using the correct names.. Initially, this is what my eclipse-sts IDE created by default
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
<display-name>BatchOverrideEJB</display-name>
<ejb-client-jar>BatchOverrideEJBClient.jar</ejb-client-jar>
</ejb-jar>
and this is how i tried accessing the EJB
Properties p = new Properties();
p.put("org.omg.CORBA.ORBInitialHost","localhost");
p.put("org.omg.CORBA.ORBInitialPort","3700");
InitialContext ctx = new InitialContext(p);
ic = new InitialContext(p);
BatchOverrideManagerRemote batchOverrideRemote =
(BatchOverrideManagerRemote) ic.lookup("java:comp/env/BatchOverrideEJB");
running this i got the following error
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at za.co.sanlam.batchovveride.test.BatchOverrideTester.main(BatchOverrideTester.java:33)
I thought this error meant that my EJB its not bound to the context, so i modified the ejb-jar.xml as follows
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:ejb="http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" version="3.1">
<enterprise-beans>
<session>
<ejb-name>BatchOverrideEJB</ejb-name>
<ejb-class>com.test.ejb.BatchOverrideManagerBean</ejb-class>
<ejb-local-ref>
<ejb-ref-name>BatchOverrideEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local>com.test.batchoverridemanager.ejb.BatchOverrideManagerLocal</local>
<ejb-link>BatchOverrideEJB</ejb-link>
</ejb-local-ref>
</session>
</enterprise-beans>
</ejb-jar
but now i get javax.naming.NameAlreadyBoundException: Use rebind to override
[/EDIT]
Try <ejb-link>MyEJB</ejb-link>. That said, test.ejb.MyLocalEJB doesn't sound like a home interface that extends EJBHome, so perhaps you meant to use <business-remote> rather than <remote> and <home>? If you're using a container that supports EJB 3.1, you'll probably find it easier to just use annotations:
#Stateless
public class MyBean implements MyLocal { ... }
#Local
public interface MyLocal { ... }
#Remote
public interface MyRemote { ... }
As an aside MyLocalBean and MyRemoteBean are unusual names for business interfaces. Typically, the Bean suffix is reserved for the EJB class itself.
Edit #2:
For the second edit, see this link:
http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#nonJavaEEwebcontainerRemoteEJB

Issues while Upgrading Jsf1.0 to Jsf2.0

While upgrading application to Jsf2.0 created in Spring3 and Jsf1.0 (myfaces), i am facing some issues mentioned below.
I have done following steps to upgrade the application.
From IntelliJ IDEA:
* Open project settings/Monitor/Dependencies
* Removed facelet*jar, el*.jars, myfaces* jars from project
* Added jsf2.0.x ri mojarra jars and tomahawk1.1.9.jar
* Open project settings/monitor/web settings
* Under "modules and libs to package": remove el-.jars,facelet-jar and myfaces jars
* Added jsf2.0.x ri mojarra jars and tomahawk1.1.9.jar
* Removed erroneous class usages from our classes Lists.java and RegExValidator.java. In Lists.java, replace import with org.apache.commons.lang.LocaleUtils. In RegExValidator, replace import with "org.apache.myfaces.shared_tomahawk.util.MessageUtils".
Edit Web.xml:
* facelets.VIEW_MAPPINGS -> javax.faces.FACELETS_VIEW_MAPPINGS
* facelets.LIBRARIES -> javax.faces.FACELETS_LIBRARIES
* Change Faces Servlet to <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
* Change header to:
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
Edit faces-config.xml:
* Add header:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
version="2.0">
* Remove line "<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>"
After doing all the steps mentioned above getting the following error:
A literal value was specified for attribute actionListener that is defined as a deferred method with a return type of void. JSP.2.3.4 does not permit literal values in this case
Actually Jsf2.0 el expressions #{myBean.property} are not getting resolved thats why its showing the above error.
Can anybody guide me, what is missing, so that i can successfully migrate application to Jsf2.0
Thanks in Advance,
Dhillon
A literal value was specified for attribute actionListener that is defined as a deferred method with a return type of void. JSP.2.3.4 does not permit literal values in this case
This EL validation error means that you've somewhere a
<h:commandButton actionListener="somestring" />
instead of
<h:commandButton actionListener="#{someBean.actionListener}" />
or
<h:commandButton action="somestring" />
(instead of h:commandButton you can also read any UICommand component like h:commandLink)
Just locate/lookup the culprit in the code and fix it accordingly.
Upgrade web-app version="3.0" to latest. Previously web-app version is 2.5 at that time I got error, after upgrade to 3.0 issue resolved.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

Resources