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.

Reply via email to