Hi, I'm creating a blog for a band, but the progree has halted as i'm facing some strange issue... Firstly, I'm using eclipse 3.6 32-bit, on GAE SDK 1.35 (gae eclipse plugin). My project is Spring 3.02 based.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// My web.xml: <?xml version="1.0" encoding="UTF-8"?> <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"> <!-- set up application contexts for spring application --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <!-- set up default context loader listener class --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</ listener-class> </listener> <!-- set up spring sevlet dispatcher --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</ servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- set up URL pattern for spring servlet --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!-- set up welcome page --> <welcome-file-list> <welcome-file>news.html</welcome-file> </welcome-file-list> </web-app> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// My applicationContext.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd"> <!-- data access layer --> <bean id="postDAO" class="com.nifrostband.web.dao.impl.PostJdoDaoImpl" /> <bean id="pageDAO" class="com.nifrostband.web.dao.impl.PageJdoDaoImpl" /> <bean id="userDAO" class="com.nifrostband.web.dao.impl.UserJdoDaoImpl" /> <!-- service layer --> <bean id="postService" class="com.nifrostband.web.service.impl.PostServiceImpl"> <property name="postDAO" ref="postDAO" /> </bean> <bean id="pageService" class="com.nifrostband.web.service.impl.PageServiceImpl"> <property name="pageDAO" ref="pageDAO" /> </bean> <bean id="userService" class="com.nifrostband.web.service.impl.UserServiceImpl"> <property name="userDAO" ref="userDAO" /> </bean> <!-- buisness logic related --> <bean id="nifrost" class="com.nifrostband.web.Nifrost"> <constructor-arg index="0" type="java.lang.String" value="<just a static value>" /> <constructor-arg index="1" type="java.lang.String" value="<just a static value>" /> </bean> </beans> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// My springmvc-servlet.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- replaced 2.5 --> <!-- user related --> <bean name="/list_users.html" class="com.nifrostband.web.controller.UserListController"> <property name="userService" ref="userService" /> </bean> <bean name="/new_user.html" class="com.nifrostband.web.controller.UserNewController"> <property name="commandClass" value="com.nifrostband.web.entity.User" / > <property name="formView" value="userNew" /> <property name="successView" value="list_users.html" /> <property name="validator"> <bean class="com.nifrostband.web.controller.validator.UserValidator" / > </property> <property name="userService" ref="userService" /> </bean> <!-- authentification related --> <bean name="/logout.html" class="com.nifrostband.web.controller.LogoutController" /> <bean name="/login.html" class="com.nifrostband.web.controller.LoginController"> <property name="commandClass" value="com.nifrostband.web.entity.LoginData" /> <property name="formView" value="login" /> <property name="successView" value="admin_console.html" /> <property name="validator"> <bean class="com.nifrostband.web.controller.validator.LoginValidator" / > </property> <property name="userService" ref="userService" /> </bean> <bean name="/admin_console.html" class="com.nifrostband.web.controller.AdminConsoleController"> <property name="postService" ref="postService" /> <property name="userService" ref="userService" /> </bean> <!-- post related --> <bean name="/news.html" class="com.nifrostband.web.controller.NewsController"> <property name="postService" ref="postService" /> </bean> <bean name="/new_post.html" class="com.nifrostband.web.controller.PostNewController"> <property name="commandClass" value="com.nifrostband.web.entity.BlogPost" /> <property name="formView" value="postNew" /> <property name="successView" value="news.html" /> <property name="validator"> <bean class="com.nifrostband.web.controller.validator.PostValidator" / > </property> <!-- <property name="postService" ref="postService" /> --> <property name="userService" ref="userService" /> </bean> <!-- page related --> <bean name="/page.html" class="com.nifrostband.web.controller.PageController"> <property name="pageService" ref="pageService" /> </bean> <bean name="/new_page.html" class="com.nifrostband.web.controller.PageNewController"> <property name="commandClass" value="com.nifrostband.web.entity.Page" / > <property name="formView" value="pageNew" /> <property name="successView" value="admin_console.html" /> <property name="validator"> <bean class="com.nifrostband.web.controller.validator.PageValidator" / > </property> <property name="pageService" ref="pageService" /> </bean> <bean name="/edit_page.html" class="com.nifrostband.web.controller.PageEditController"> <property name="commandClass" value="com.nifrostband.web.entity.Page" / > <property name="formView" value="pageEdit" /> <property name="successView" value="page.html" /> <property name="validator"> <bean class="com.nifrostband.web.controller.validator.PageValidator" / > </property> <property name="pageService" ref="pageService" /> </bean> <!-- misc --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- <property name="exposeContextBeansAsAttributes" value="true"/> -- > <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </beans> ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// My BlogPost.java: package com.nifrostband.web.entity; import java.util.Date; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.Text; @PersistenceCapable public class BlogPost { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private String title; @Persistent private Text content; @Persistent private Date date; @Persistent private User user; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Text getContent() { return content; } public void setContent(Text content) { this.content = content; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public void setId(Long id) { this.id = id; } public Long getId() { return id; } public void setUser(User user) { this.user = user; } public User getUser() { return user; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// My PostNewController.java: package com.nifrostband.web.controller; import java.util.Collection; import java.util.Date; import java.util.EnumSet; import java.util.Set; import javax.jdo.Extent; import javax.jdo.FetchGroup; import javax.jdo.FetchPlan; import javax.jdo.JDOException; import javax.jdo.ObjectState; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory; import javax.jdo.Query; import javax.jdo.Transaction; import javax.jdo.datastore.JDOConnection; import javax.jdo.datastore.Sequence; import javax.jdo.listener.InstanceLifecycleListener; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import net.sf.jsr107cache.Cache; import org.springframework.validation.BindException; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.view.RedirectView; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; import com.nifrostband.web.PMF; import com.nifrostband.web.Utils; import com.nifrostband.web.gae.SessionMemCacheManager; import com.nifrostband.web.gae.editor.GoogleDatastoreTextEditor; import com.nifrostband.web.service.PostService; import com.nifrostband.web.service.UserService; import com.nifrostband.web.entity.Admin; import com.nifrostband.web.entity.BlogPost; import com.nifrostband.web.entity.LoginData; public class PostNewController extends AbstractNifrostFormController { private UserService userService; @InitBinder protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(com.google.appengine.api.datastore.Text.class, new GoogleDatastoreTextEditor() ); } @Override protected Object formBackingObject(HttpServletRequest request) throws Exception { System.out.println("start formbackingObject"); BlogPost defaultpost = new BlogPost(); if (isFormSubmission(request)) { LoginData loginData = (LoginData) request.getSession().getAttribute("LOGIN_DATA"); System.out.println("logging in as "+loginData.getUsername()); Key objectkey = KeyFactory.createKey(Admin.class.getSimpleName(), loginData.getUsername()); Admin user = userService.getAdmin(objectkey); System.out.println("authenticated as user "+user.getId()); defaultpost.setUser(user); } System.out.println("end formbackingObject: returning defaultpost"); return defaultpost; } @Override protected ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception { // get sessionid from any existing cookie String sessionid = Utils.getCookieValue(request.getCookies(), "sessionid", Utils.generateSessionId()); response.addCookie(new Cookie("sessionid", sessionid)); //This does nothing if the cookies already exists // get memcache session implementation singleton Cache cache = SessionMemCacheManager.getCache(); // test is session is valid (got a loginData reference) LoginData loginData = (LoginData) cache.get(sessionid); if ( loginData==null) { // either memcache doesn't contain a the session data, or nobody is logged in // do ordinary session lookup approach HttpSession session = request.getSession(true); loginData = (LoginData) session.getAttribute("LOGIN_DATA"); if ( loginData!=null ) { return super.showForm(request, response, errors); } response.sendError(HttpServletResponse.SC_FORBIDDEN); return null; } return super.showForm(request, response, errors); } @Override public ModelAndView onSubmit(Object command) throws ServletException { //postService.storePost((BlogPost)command); PersistenceManager pm = PMF.get().getPersistenceManager(); try { System.out.println("persisting"); pm.makePersistent((BlogPost)command); }catch (Exception e) { System.out.println("error persisting"); } return new ModelAndView(new RedirectView(getSuccessView())); } public void setUserService(UserService userService) { this.userService = userService; } public UserService getUserService() { return userService; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// The problem and my "test case" ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// The problem is that I'm unable to persist the BlogPost entity from my PostNewController, and, It might wouldn't sound that strange if I was unable to persist it from anywhere in my application, but that isn't the case - I'm able to persist entities of BlogPost from forexample my NewsController.java (just lists BlogPosts) throught my DAO like this in the method handleRequest(HttpServletRequest arg0, HttpServletResponse arg1: BlogPost p = new BlogPost(); p.setTitle("New album on it's way!"); p.setContent(new Text("more info to come...")); p.setDate(new Date()); p.setUser(new Admin()); PersistenceManager pm = PMF.get().getPersistenceManager(); try { pm.makePersistent(p); }catch (Exception e) { // TODO: handle exception } But when I put this in my PostNewController's onSubmit(Object command) nothing is persisted. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Additional info: Eclipse reports no build errors, and datanucleus enhancer runs fine... -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.
