Ошибка при использовании Google Objectify

Я получаю сообщение об ошибке при использовании objectify. На самом деле я использую его в очень простом приложении, основанном на пружине, но не понимаю, как сделать то же самое. чтобы было проще, я не использую слой сервиса / дао.

Модель:

package com.tut.yudi.model;

import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Index;

//import java.util.Date;
import java.io.Serializable;

@Entity
public class Subject implements Serializable {

    private static final long serialVersionUID = 1L;
    //private long subjectId;

  @Id
    @Index
    private String subjectName;
    private int subjectRank;
    private char status;

    public String getSubjectName() {
        return subjectName;
    }
    public void setSubjectName(String subjectName) {
        this.subjectName = subjectName;
    }
    public int getSubjectRank() {
        return subjectRank;
    }
    public void setSubjectRank(int subjectRank) {
        this.subjectRank = subjectRank;
    }
    public char getStatus() {
        return status;
    }
    public void setStatus(char status) {
        this.status = status;
    }

}

Класс OfyService:

package com.tut.yudi.common.dao;

import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.ObjectifyService;
import com.tut.yudi.model.Subject;

public class OfyService {
    static {
        factory().register(Subject.class);
        //ObjectifyService.register(Subject.class); --also doesn't work
    }

    public static Objectify ofy() {
        return ObjectifyService.ofy();
    }

    public static ObjectifyFactory factory() {
        return ObjectifyService.factory();
    }
}

мой контроллер:

    package com.tut.yudi.controller;

import static com.tut.yudi.common.dao.OfyService.ofy;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.tut.yudi.controller.Hello;
import com.tut.yudi.model.Subject;

import java.util.logging.Logger;

@Controller
public class Hello
{
   protected static Logger logger = Logger.getLogger(Hello.class.getName());

   @RequestMapping("/")
   public String home()
   {
      //sop();
      return "a";
   }

   @RequestMapping(value = "/hello")
   public String hello()
   {
      //sop();

      //some comment

      Subject subject = new Subject();
      subject.setSubjectName("JAVA");
      subject.setSubjectRank(1);
      subject.setStatus('A');
      System.out.println("Model object created...");

      //some coment
      ofy().save().entity(subject).now();
      System.out.println("object created....");
      return "b";
   }

}

Вот журналы:

Dec 24, 2013 9:15:58 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
INFO: Successfully processed /var/vcap.local/dea/apps/app-g7u2pbf8emc4gvmc-0-df6c037b5f628879778de0427da1f7e4/app/WEB-INF/appengine-web.xml
Dec 24, 2013 9:15:58 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
INFO: Successfully processed /var/vcap.local/dea/apps/app-g7u2pbf8emc4gvmc-0-df6c037b5f628879778de0427da1f7e4/app/WEB-INF/web.xml
Dec 24, 2013 9:15:58 PM com.google.appengine.tools.development.SystemPropertiesManager setSystemProperties
INFO: Overwriting system property key 'java.util.logging.config.file', value '/var/vcap.local/dea/apps/app-g7u2pbf8emc4gvmc-0-df6c037b5f628879778de0427da1f7e4/appengine-java-sdk/config/sdk/logging.properties' with value 'WEB-INF/logging.properties' from '/var/vcap.local/dea/apps/app-g7u2pbf8emc4gvmc-0-df6c037b5f628879778de0427da1f7e4/app/WEB-INF/appengine-web.xml'
Dec 24, 2013 9:15:58 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
Dec 24, 2013 9:15:59 PM com.google.appengine.tools.development.IsolatedAppClassLoader checkWorkingDirectory
WARNING: Your working directory, (/var/vcap.local/dea/apps/app-g7u2pbf8emc4gvmc-0-df6c037b5f628879778de0427da1f7e4) is not equal to your 
web application root (/var/vcap.local/dea/apps/app-g7u2pbf8emc4gvmc-0-df6c037b5f628879778de0427da1f7e4/app)
You will not be able to access files from your working directory on the production server.

Dec 24, 2013 9:15:59 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: jetty-6.1.x
Dec 24, 2013 9:16:20 PM com.google.appengine.tools.development.ApiProxyLocalImpl log
INFO: javax.servlet.ServletContext log: Initializing Spring root WebApplicationContext
log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Dec 24, 2013 9:16:27 PM com.google.appengine.tools.development.ApiProxyLocalImpl log
INFO: javax.servlet.ServletContext log: Initializing Spring FrameworkServlet 'spring'
Dec 24, 2013 9:16:27 PM com.google.apphosting.utils.jetty.JettyLogger info
INFO: Started SelectChannelConnector@0.0.0.0:36886
Dec 24, 2013 9:16:27 PM com.google.appengine.tools.development.AbstractServer startup
INFO: Server default is running at http://localhost:36886/
Dec 24, 2013 9:16:27 PM com.google.appengine.tools.development.AbstractServer startup
INFO: The admin console is running at http://localhost:36886/_ah/admin
Dec 24, 2013 9:16:27 PM com.google.appengine.tools.development.DevAppServerImpl start
INFO: Dev App Server is now running
Dec 24, 2013 9:17:22 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: /hello
java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at com.google.appengine.tools.development.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70)
    at com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:64)
    at com.tut.yudi.controller.Hello.hello(Hello.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectRequest(DevAppServerServersFilter.java:369)
    at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectServerRequest(DevAppServerServersFilter.java:352)
    at com.google.appengine.tools.development.DevAppServerServersFilter.doFilter(DevAppServerServersFilter.java:115)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:421)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: java.lang.NullPointerException
    at java.lang.Class.isAssignableFrom(Native Method)
    at com.googlecode.objectify.impl.TypeUtils.isAssignableFrom(TypeUtils.java:179)
    at com.googlecode.objectify.impl.translate.NumberTranslatorFactory.create(NumberTranslatorFactory.java:25)
    at com.googlecode.objectify.impl.translate.NumberTranslatorFactory.create(NumberTranslatorFactory.java:18)
    at com.googlecode.objectify.impl.translate.TranslatorRegistry.create(TranslatorRegistry.java:90)
    at com.googlecode.objectify.impl.translate.ClassTranslator.(ClassTranslator.java:52)
    at com.googlecode.objectify.impl.translate.EntityClassTranslator.(EntityClassTranslator.java:46)
    at com.googlecode.objectify.impl.Transmog.(Transmog.java:49)
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.(ConcreteEntityMetadata.java:58)
    at com.googlecode.objectify.impl.Registrar.register(Registrar.java:74)
    at com.googlecode.objectify.ObjectifyFactory.register(ObjectifyFactory.java:180)
    at com.tut.yudi.common.dao.OfyService.(OfyService.java:10)
    ... 58 more
Dec 24, 2013 9:17:22 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Nested in java.lang.ExceptionInInitializerError:
java.lang.NullPointerException
    at java.lang.Class.isAssignableFrom(Native Method)
    at com.googlecode.objectify.impl.TypeUtils.isAssignableFrom(TypeUtils.java:179)
    at com.googlecode.objectify.impl.translate.NumberTranslatorFactory.create(NumberTranslatorFactory.java:25)
    at com.googlecode.objectify.impl.translate.NumberTranslatorFactory.create(NumberTranslatorFactory.java:18)
    at com.googlecode.objectify.impl.translate.TranslatorRegistry.create(TranslatorRegistry.java:90)
    at com.googlecode.objectify.impl.translate.ClassTranslator.(ClassTranslator.java:52)
    at com.googlecode.objectify.impl.translate.EntityClassTranslator.(EntityClassTranslator.java:46)
    at com.googlecode.objectify.impl.Transmog.(Transmog.java:49)
    at com.googlecode.objectify.impl.ConcreteEntityMetadata.(ConcreteEntityMetadata.java:58)
    at com.googlecode.objectify.impl.Registrar.register(Registrar.java:74)
    at com.googlecode.objectify.ObjectifyFactory.register(ObjectifyFactory.java:180)
    at com.tut.yudi.common.dao.OfyService.(OfyService.java:10)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:186)
    at com.google.appengine.tools.development.agent.runtime.RuntimeHelper.checkRestricted(RuntimeHelper.java:70)
    at com.google.appengine.tools.development.agent.runtime.Runtime.checkRestricted(Runtime.java:64)
    at com.tut.yudi.controller.Hello.hello(Hello.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectRequest(DevAppServerServersFilter.java:369)
    at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectServerRequest(DevAppServerServersFilter.java:352)
    at com.google.appengine.tools.development.DevAppServerServersFilter.doFilter(DevAppServerServersFilter.java:115)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:421)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Благодарю.

2 ответа

Решение

Есть несколько вещей, которые вы должны проверить:

  1. Исключение связано с обработкой Objectify примитивных типов в вашем объекте Subject, поэтому я бы решил использовать Integer и Character (вместо char и int) в этом классе. Мне не удалось воспроизвести его, так что, возможно, это исправленная ошибка или какое-то другое взаимодействие.
  2. И @Id, и @Index для Subject.subjectName не нужны?

ETOOMUCHCOMPLEXITY: уровни абстракции, добавленные фреймворками, приводят к тому, что информация об ошибках в трассировке стека не коррелирует с вашим исходным кодом. Создайте самое маленькое новое приложение, которое работает. Постепенно добавляйте и тестируйте части своего приложения, пока оно не сломается, затем вернитесь к тому, что сработало, и попробуйте что-нибудь еще.

Самое раннее упоминание вашего исходного кода в трассировке стека - это строка 38. Hello.java. Считая их, строка 38 - это конец файла! Это, вероятно, означает, что класс Hello в целом выглядит хорошо, но не может инициализироваться. Поскольку сам класс Hello очень прост, ошибка, скорее всего, связана с другими вещами, от которых он зависит.

Другие вопросы по тегам