From: jbosszone <do-...@jb...> - 2005-11-06 13:49:21
|
Post Subject : Tutorial on JBossIDE EJB3.0 Tools Ref. 1 : JBoss IDE TrailBlazer : Hike 1 - EJB 3.0 Tools http://trailblazer.demo.jboss.com/IDETrail/ =3D=3D=3D Environment in use; - Windows XP SP2 - JDK 1.5.0_05 - JBoss AS 4.0.3SP1 - JBoss IDE1.5RC1 + Eclipse 3.1.1 Following notes/findings cover only Task 5 below; Task 1: Download and install JDK 1.5 Task 2: Install JBoss AS 4.0.3SP1 using the installer Task 3: Download and install JBoss IDE1.5RC1 and Eclipse3.1.1 Task 4: Configure Eclipse and JBossIDE to control JBoss AS Task 5: Carry out a tutorial (Ref. 1) - Ref. 1 contains following trails; Trail 1: Create an EJB 3.0 Project Trail 2: Create EJB 3.0 Entity Beans Trail 3: Create EJB 3.0 Session Beans Trail 4: Create a Java Servlet Trail 5: Package an EJB 3.0 Application Trail 6: Deploy and Debug Trail 1: Create an EJB 3.0 Project - follow the trail in Ref. 1 =3D jump over "Create a JBoss configuration" link since it has been configu= red at Task 4 in the last post of this thread. - on completion of the project named "articles", confirm following point be= fore proceeding further steps. =3D in the Eclipse Package Explorer, the JRE System Library path is to be "= [jdk 1.5]", not "(C:\)"[jre 1.5.0_05]" (see Task 1. in the last post) =3D if not, change the library location as follow; =3D right-click the project "articles" in the Package Explorer. =3D then, go to "Properties > Java Build Path > Libraries > JRE System Libr= ary > Edit... > Installed JREs... > Edit..." =3D in "Edit JRE" box; * JRE name --> jdk 1.5 * JRE home directory --> C:\jdk1.5.0_05\jre =3D click "OK"... Trail 2: Create EJB 3.0 Entity Beans - create "Article.java" and "Author.java" as per the trail in Ref. 1 - type "@E" then "Ctrl+space" for the code assist, a pop-up menu shows a li= st of annotations. - select "@Entity" =3D note1: If no "@Entity", * right-click the project "articles" in the Eclipse Package Explorer (left = top). * then go to "Properties > Java Build Path > Libraries (tag) > Add External= JARs..." * add "ejb3-persistence.jar" under "..\server\all\deploy\ejb3.deployer". =3D note2: Creation of the class "Author" (in Article.java) * place the mouse cursor on "Author", then "Ctrl+1" (or right-click "light-= bulb") to show "Quick Fix" =3D note3: "Organize Imports" for "Collection" (in Author.java) * place the mouse cursor on "Collection" * then "Ctrl+Shift+O" to show "Organize Imports" * (or right-click "light-bulb", then Quick Fix)=20 Trail 3: Create EJB 3.0 Session Beans - create "Authors.java" and "AuthorsBean.java" as per the trail in Ref. 1 - in "AuthorsBean.java", use "@PersistenceContext" instead of "@Inject". Ref.: "A problem with @Injected EntityManager" http://www.jboss.org/index.html?module=3Dbb&op=3Dviewtopic&t=3D66949 Trail 4: Create a Java Servlet - add "J2EE 1.4Libraries (JBoss-IDE)" and - create "AuthorServlet.java" as per the trail in Ref. 1 =3D note1: On completion of the servlet, descriptions in "Problems" tag in = the Eclipse workbench might show; Problem : "The serializable class AuthorServlet does not declare a static f= inal serialVersionUID field of type long" | AuthorServlet.java=09articles/src/org/jboss/ejb3demo/web=09line xx * if the problem occur, * place mouse cursor on "AuthorServlet", then "Ctl+1". * select and double-click "Add default serial version ID" * a set of codes below is added at the top and the problem will be gone. /** | *=20 | */ | private static final long serialVersionUID =3D 1L; =3D note2: Apply same process as Note1 to following classes, if necessary; * class "Article" in "Article.java" * class "Author" in "Author.java" Trail 5: Package an EJB 3.0 Application - as per the steps in Ref. 1 Trail 6: Deploy and Debug - start "Debug" session to start JBoss AS and deploy .ejb3 and .war files a= s per the steps in Ref. 1 - go to URL "http://localhost:8080/authors/authors" and see the results. =3D they might be as follows (error); HTTP Status 500 -=20 | -----------------------------------------------------------------------= ------------------ | type Exception report |=20 | message=20 | description The server encountered an internal error () that prevented = it from fulfilling=20 | this request. |=20 | exception=20 | java.lang.reflect.UndeclaredThrowableException | =09$Proxy83.addAuthor(Unknown Source) | =09org.jboss.ejb3demo.web.AuthorServlet.createArticles(AuthorServlet.ja= va:57) | =09org.jboss.ejb3demo.web.AuthorServlet.doPost(AuthorServlet.java:50) | =09javax.servlet.http.HttpServlet.service(HttpServlet.java:717) | =09javax.servlet.http.HttpServlet.service(HttpServlet.java:810) | =09org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderF= ilter.java:81) |=20 | note The full stack trace of the root cause is available in the Apache = Tomcat/5.5 logs. | -----------------------------------------------------------------------= ------------------- | Apache Tomcat/5.5 - if so, modify "Articles.java" and "Author.java" (not "Authors.java") Ref.: "JBoss EJB3.0 tutorial problems and solutions" http://www.jboss.org/index.html?module=3Dbb&op=3Dviewtopic&t=3D69256 In "Articles.java"; | add : import java.io.Serializable; | change : public class Article {... --> public class Article implements = Serializable {... |=20 | In "Author.java"; | add : import java.io.Serializable; | change : public class Author {... --> public class Author implements Se= rializable {... - then, re-packaging and re-deploy them. =3D note1: re-deploy both of .ejb3 and .war files even if revision is one s= ide only, otherwise the results might not come properly. =3D note2: a few repetition might be necessary to get the results. Repeat u= n-deploy/re-packaging/re-deploy if no success. =3D In "server.log" file, following part seems to be a set of characteristi= c messages of ejb3/hibernate in case of normal process. : | 2005-11-06 15:31:46,440 DEBUG [org.jboss.ejb3.entity.ManagedEntityManag= erFactory] GETTING NEW ... | 2005-11-06 15:31:46,440 DEBUG [org.jboss.ejb3.entity.ManagedEntityManag= erFactory] logLived... | 2005-11-06 15:31:46,440 DEBUG [org.jboss.ejb3.entity.ManagedEntityManag= erFactory] LONG LIVED ... | 2005-11-06 15:31:46,440 DEBUG [org.hibernate.impl.SessionImpl] opened s= ession at timestamp: ... | 2005-11-06 15:31:46,440 DEBUG [org.hibernate.impl.SessionImpl] find: fr= om Author | 2005-11-06 15:31:46,440 DEBUG [org.hibernate.engine.QueryParameters] na= med parameters: {} | 2005-11-06 15:31:46,440 DEBUG [org.hibernate.hql.ast.QueryTranslatorImp= l] parse() - HQL: from ... | 2005-11-06 15:31:46,450 DEBUG [org.hibernate.hql.ast.AST] --- HQL AST -= -- | \-[QUERY] 'query' | \-[SELECT_FROM] 'SELECT_FROM' | \-[FROM] 'from' | \-[RANGE] 'RANGE' | \-[DOT] '.' | +-[DOT] '.' | | +-[DOT] '.' | | | +-[IDENT] 'org' | | | \-[IDENT] 'jboss' | | \-[IDENT] 'ejb3demo' | \-[IDENT] 'Author' |=20 | 2005-11-06 15:31:46,450 DEBUG [org.hibernate.hql.ast.ErrorCounter] thro= wQueryException() : ... | 2005-11-06 15:31:46,460 DEBUG [org.hibernate.hql.antlr.HqlSqlBaseWalker= ] select << begin ... | 2005-11-06 15:31:46,460 DEBUG [org.hibernate.hql.ast.tree.FromElement] = FromClause{level=3D1} ... | 2005-11-06 15:31:46,460 DEBUG [org.hibernate.hql.antlr.HqlSqlBaseWalker= ] select : finishing ... | 2005-11-06 15:31:46,460 DEBUG [org.hibernate.hql.ast.HqlSqlWalker] proc= essQuery() : ( SELECT ... | 2005-11-06 15:31:46,460 DEBUG [org.hibernate.hql.ast.HqlSqlWalker] Deri= ved SELECT clause created. | 2005-11-06 15:31:46,460 DEBUG [org.hibernate.hql.ast.util.JoinProcessor= ] Using FROM fragment ... | 2005-11-06 15:31:46,460 DEBUG [org.hibernate.hql.antlr.HqlSqlBaseWalker= ] select >> end ... | 2005-11-06 15:31:46,470 DEBUG [org.hibernate.hql.ast.AST] --- SQL AST -= -- | \-[SELECT] QueryNode: 'SELECT' querySpaces (AUTHORS) | +-[SELECT_CLAUSE] SelectClause: '{derived select clause}' | | +-[SELECT_EXPR] SelectExpressionImpl: 'author0_.authorId as auth= orId9_' {FromElement{... | | \-[SQL_TOKEN] SqlFragment: 'author0_.name as name9_' | \-[FROM] FromClause: 'from' FromClause{level=3D1, fromElementCounte= r=3D1, fromElements=3D1, ... | \-[FROM_FRAGMENT] FromElement: 'AUTHORS author0_' FromElement{ex= plicit,not a collection ... |=20 | 2005-11-06 15:31:46,470 DEBUG [org.hibernate.hql.ast.ErrorCounter] thro= wQueryException() : ... | 2005-11-06 15:31:46,470 DEBUG [org.hibernate.hql.ast.QueryTranslatorImp= l] HQL: from org.jboss... | 2005-11-06 15:31:46,470 DEBUG [org.hibernate.hql.ast.QueryTranslatorImp= l] SQL: select author0_... | 2005-11-06 15:31:46,470 DEBUG [org.hibernate.hql.ast.ErrorCounter] thro= wQueryException() : ... | : =3D in "HSQL Database Manager", type "select * from ARTICLES" to confirm th= e records. ARTICLEID TITLE BODY AUTHORID | -------------------------------------------------------------------- | 1 marshall's 1st article this is an article 1 | 2 marshall's 2nd article this is also article 2 | 3 max's 1st article this is an article 3 | 4 max's 2nd article this is also article 4 =3D for "AUTHORS"; AUTHORID NAME | ------------------- | 1 Marshall | 2 Marshall | 3 Max | 4 Max =3D=3D=3D Ref. On completion of the trails, the files are as follow; Article.java=20 package org.jboss.ejb3demo; |=20 | import java.io.Serializable; |=20 | import javax.persistence.Column; | import javax.persistence.Entity; | import javax.persistence.GeneratorType; | import javax.persistence.Id; | import javax.persistence.JoinColumn; | import javax.persistence.ManyToOne; | import javax.persistence.Table; |=20 | @Entity | @Table(name =3D "ARTICLES") | public class Article implements Serializable { |=20 | =09/** | =09 *=20 | =09 */ | =09private static final long serialVersionUID =3D 1L; | =09 | =09private int articleId; | =09private String title; | =09private String body; | =09private Author author; | =09 | =09@Id (generate =3D GeneratorType.AUTO) | =09@Column (name =3D "articleId") | =09public int getArticleId() { | =09=09return articleId; | =09} | =09public void setArticleId(int articleId) { | =09=09this.articleId =3D articleId; | =09} | =09 | =09@ManyToOne | =09@JoinColumn (name =3D "authorId") | =09public Author getAuthor() { | =09=09return author; | =09} | =09public void setAuthor(Author author) { | =09=09this.author =3D author; | =09} | =09public String getBody() { | =09=09return body; | =09} | =09public void setBody(String body) { | =09=09this.body =3D body; | =09} | =09public String getTitle() { | =09=09return title; | =09} | =09public void setTitle(String title) { | =09=09this.title =3D title; | =09} | } Authors.java package org.jboss.ejb3demo; |=20 | import java.util.List; | import javax.ejb.Remote; |=20 | @Remote | public interface Authors { | =09public List<Author> getAllAuthors(); | =09public Author addAuthor (String name); | =09public void addArticle (Author author, String title, String body); | } AuthorsBean.java package org.jboss.ejb3demo; |=20 | import javax.ejb.Stateless; |=20 | import java.util.ArrayList; | import java.util.List; |=20 | import javax.persistence.EntityManager; | import javax.persistence.PersistenceContext; | import javax.persistence.Query; |=20 |=20 | public @Stateless class AuthorsBean implements Authors { |=20 | =09@PersistenceContext | =09private EntityManager manager; | =09 | =09public void addArticle(Author author, String title, String body) { | =09=09manager.persist(author); | =09=09author.addArticle(title, body); | =09} |=20 | =09public Author addAuthor(String name) { | =09=09Author author =3D new Author(); | =09=09author.setName(name); | =09=09return author; | =09} |=20 | =09public List<Author> getAllAuthors() { | =09=09ArrayList<Author> authors =3D new ArrayList<Author>(); | =09=09Query q =3D manager.createQuery("from Author"); | =09=09 | =09=09for (Object o : q.getResultList()) | =09=09{ | =09=09=09authors.add((Author) o); | =09=09} | =09=09return authors; | =09} | } Author.java package org.jboss.ejb3demo; |=20 | import java.io.Serializable; | import java.util.ArrayList; | import java.util.Collection; |=20 | import javax.persistence.CascadeType; | import javax.persistence.Column; | import javax.persistence.Entity; | import javax.persistence.FetchType; | import javax.persistence.GeneratorType; | import javax.persistence.Id; | import javax.persistence.JoinColumn; | import javax.persistence.OneToMany; | import javax.persistence.Table; |=20 | @Entity | @Table(name =3D "AUTHORS") | public class Author implements Serializable { |=20 | =09/** | =09 *=20 | =09 */ | =09private static final long serialVersionUID =3D 1L; | =09 | =09private int authorId; | =09private String name; | =09private Collection<Article> articles; | =09 | =09@OneToMany (cascade =3D CascadeType.ALL, fetch =3D FetchType.EAGER, = mappedBy =3D "author") | =09@JoinColumn (name =3D "authorId") | =09public Collection<Article> getArticles() { | =09=09return articles; | =09} |=20 | =09public void setArticles(Collection<Article> articles) { | =09=09this.articles =3D articles; | =09} | =09 | =09@Id(generate =3D GeneratorType.AUTO) | =09@Column (name =3D "authorId") | =09public int getAuthorId() { | =09=09return authorId; | =09} |=20 | =09public void setAuthorId(int authorId) { | =09=09this.authorId =3D authorId; | =09} |=20 | =09public String getName() { | =09=09return name; | =09} |=20 | =09public void setName(String name) { | =09=09this.name =3D name; | =09} | =09 | =09public void addArticle(String title, String body) { | =09=09if (articles =3D=3D null) | =09=09=09articles =3D new ArrayList<Article>(); | =09=09Article article =3D new Article(); | =09=09article.setAuthor(this); | =09=09article.setBody(body); | =09=09article.setTitle(title); | =09=09articles.add(article); | =09} | } AuthorServlet.java package org.jboss.ejb3demo.web; |=20 | import java.io.IOException; | import java.io.PrintWriter; |=20 | import javax.naming.Context; | import javax.naming.InitialContext; | import javax.naming.NamingException; | import javax.servlet.ServletException; | import javax.servlet.http.HttpServlet; | import javax.servlet.http.HttpServletRequest; | import javax.servlet.http.HttpServletResponse; |=20 | import org.jboss.ejb3demo.Article; | import org.jboss.ejb3demo.Author; | import org.jboss.ejb3demo.Authors; |=20 | public class AuthorServlet extends HttpServlet { |=20 | =09/** | =09 *=20 | =09 */ | =09private static final long serialVersionUID =3D 1L; | =09private Authors authorsBean; | =09 | =09public void init() throws ServletException { | =09=09try { | =09=09=09Context context =3D new InitialContext(); | =09=09=09authorsBean =3D(Authors) context.lookup(Authors.class.getName(= )); | =09=09} catch (NamingException e) { | =09=09=09e.printStackTrace(); | =09 } | =09} | =09 | =09protected void doGet(HttpServletRequest req, HttpServletResponse res= p) | =09 throws ServletException, IOException { | =09=09doPost(req, resp); | =09} | =09 | =09protected void doPost(HttpServletRequest req, HttpServletResponse re= sp) | =09 throws ServletException, IOException { | =09=09String mode =3D req.getParameter("mode"); |=20 | =09=09if (mode =3D=3D null) | =09=09=09mode =3D "show"; | =09=09if (mode.equals("show")) | =09=09{ | =09=09=09showArticles(req, resp); | =09=09} | =09=09else if (mode.equals("create")) | =09=09{ | =09=09=09createArticles(req, resp); | =09=09} | =09} |=20 | =09private void createArticles(HttpServletRequest req, HttpServletRespo= nse resp) | =09=09throws ServletException, IOException | =09{ | =09=09Author marshall =3D authorsBean.addAuthor("Marshall"); | =09=09Author max =3D authorsBean.addAuthor("Max"); | =09=09 | =09=09authorsBean.addArticle(marshall, "marshall's 1st article", "this = is an article"); | =09=09authorsBean.addArticle(marshall, "marshall's 2nd article", "this = is also an article"); | =09=09authorsBean.addArticle(max, "max's 1st article", "this is an= article"); | =09=09authorsBean.addArticle(max, "max's 2nd article", "this is al= so an article"); |=20 | =09=09showArticles(req, resp); | =09} |=20 | =09private void showArticles(HttpServletRequest req, HttpServletRespons= e resp) | =09=09throws ServletException, IOException=09 | =09{ | =09=09PrintWriter out =3D resp.getWriter(); | =09=09 | =09=09for (Author author : authorsBean.getAllAuthors()) | =09=09{ | =09=09=09for (Article article : author.getArticles()) | =09=09=09{ | =09=09=09=09out.println("<b>" + article.getTitle() + "</b>"=09+ " by <i= >" + author.getName() + "</i><br/>"); | =09=09=09=09out.println("=C2=A0 =C2=A0 " + article.getBody() + "<br/><b= r/>"); | =09=09=09} | =09=09} | =09=09out.println("<form method=3D\"POST\" action=3D\"authors\">"); | =09=09out.println("<input type=3D\"hidden\" name=3D\"mode\" value=3D\"c= reate\">"); | =09=09out.println("<input type=3D\"submit\" value=3D\"Create articles\"= >"); | =09=09out.println("</form>"); | =09} | } web.xml <?xml version=3D"1.0" encoding=3D"UTF-8"?> | <web-app version=3D"2.4" | =09xmlns=3D"http://java.sun.com/xml/ns/j2ee" | =09xmlns:xsi=3D"http://www.w3.org/2001/XMLSchema-instance" | =09xsi:schemaLocation=3D"http://java.sun.com/xml/ns/j2ee http://java.su= n.com/xml/ns/j2ee/web-app_2_4.xsd"> | =09<servlet> | =09=09<servlet-name>AuthorServlet</servlet-name> | =09=09<servlet-class>org.jboss.ejb3demo.web.AuthorServlet</servlet-clas= s> | =09</servlet> | =09<servlet-mapping> | =09=09<servlet-name>AuthorServlet</servlet-name> | =09=09<url-pattern>/authors</url-pattern> | =09</servlet-mapping> | </web-app> packaging-build.xml <?xml version=3D"1.0" encoding=3D"UTF-8"?> | <project name=3D"Packaging Generator" default=3D"_packaging_generation_= "> | <target name=3D"_packaging_generation_" depends=3D"N65540,N65557"/> | <target name=3D"N65540" description=3D"authors-beans.ejb3"> | <jar destfile=3D"authors-beans.ejb3"> | <zipfileset dir=3D"bin" excludes=3D"**/*Servlet.java"/> | </jar> | </target> | <target name=3D"N65557" description=3D"authors.war"> | <jar destfile=3D"authors.war"> | <zipfileset dir=3D"src" prefix=3D"WEB-INF"> | <include name=3D"web.xml"/> | </zipfileset> | <zipfileset dir=3D"bin" prefix=3D"WEB-INF/classes" includes=3D"**/*Serv= let.java"/> | </jar> | </target> | </project> jbosszone View the original post : http://www.jboss.com/index.html?module=3Dbb&op=3Dv= iewtopic&p=3D3905649#3905649 Reply to the post : http://www.jboss.com/index.html?module=3Dbb&op=3Dpostin= g&mode=3Dreply&p=3D3905649 |