2015-11-03 74 views
0

我在多模块项目,该项目由Neo4jSession在Spring MVC模块

  • 休息的工作将无法识别NodeEntity为持久化类 - 一个Spring MVC的模块,它包含@RestControllers等。
  • 核心 - 它利用春数据的Neo4j 4,并包含一个模块都是我@Services@Repositories
  • 如预期的

核心模块工作的所有的单元测试,并成功坚持所有domain实体

但任何调用@RestController方法domain实体失效时要坚持,我也得到了以下消息:

INFO org.neo4j.ogm.session.Neo4jSession - server.core.domain.nodes.User is not an instance of a persistable class

模块C onfig类

@EnableTransactionManagement 
@Configuration 
@ImportResource({"classpath:spring-config.xml"}) 
@EnableNeo4jRepositories(basePackages = "server.core.repositories") 
public class MyNeo4jConfiguration extends Neo4jConfiguration { 


    @Override 
    public Neo4jServer neo4jServer() { 
     return new RemoteServer(url, user, pass); 
    } 


    @Override 
    public SessionFactory getSessionFactory() { 
     return new SessionFactory("server.core.domain"); 
    } 
} 

的web.xml

<web-app version="2.4" 
     xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

    <display-name>Rest</display-name> 

    <servlet> 
     <servlet-name>rest</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      WEB-INF/rest-servlet.xml 
     </param-value> 
    </context-param> 

    <servlet-mapping> 
     <servlet-name>rest</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 
</web-app> 

WEB-INF /休息-servlet.xml中

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/mvc 
     http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> 

    <bean class="server.core.MyNeo4jConfiguration" /> 
    <context:component-scan base-package="rest"/> 
    <mvc:annotation-driven /> 
    <context:annotation-config /> 



    <bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/> 
</beans> 

控制器

@RestController 
public class UserController { 
    @Autowired 
    IUserService userService; 

    @RequestMapping(value = "/create-user", method = RequestMethod.GET) 
    public ResponseEntity<?> createUser() { 
     User user = userService.createOrUpdateUser(new User("john", "doe")); //does not persist user 
     HttpHeaders httpHeaders = new HttpHeaders(); 
     return new ResponseEntity<>(user, httpHeaders, HttpStatus.ACCEPTED); 
    } 
} 

UserService.java

@Service("userService") 
public class UserService implements IUserService { 

    @Autowired 
    UserRepository userRepository; // extends GraphRepository 

    @Override 
    public User createOrUpdateUser(User user){ 
     user.setStatus(AppEnums.NodeStatus.ACTIVE); 
     return userRepository.save(user); 
    } 
} 
+0

你可以发布IUserService和/或UserRepository的内容吗? – Selwyn

+0

添加了用户服务,userRepository使用'GraphRepository.save'方法 – Xipo

回答

4
INFO org.neo4j.ogm.session.Neo4jSession - server.core.domain.nodes.User is not an instance of a persistable class 

是指示其中用户类住包路径不是由会话工厂构造@Bean提供(或扫描)。

因此,请确保在您的Rest应用程序中,您正在初始化您在Stackoverflow问题中发布的SessionFactory ...以及正确/预期的根包路径。

在整个项目上执行“SessionFactory”的文件/字符串搜索来验证。


另外,这里是将SessionFactory构造的Java文档这表明一个可以通过多条路径作为指定参数和所有子包也将被扫描。此外,可以通过特定的类进入ARGS ...

@Override 
public SessionFactory getSessionFactory() { 
    return new SessionFactory("server.core.domain"); 
} 

org.neo4j.ogm.session.SessionFactory.SessionFactory(字符串...包)

/** 
* Constructs a new {@link SessionFactory} by initialising the object-graph mapping meta-data from the given list of domain 
* object packages. 
* <p> 
* The package names passed to this constructor should not contain wildcards or trailing full stops, for example, 
* "org.springframework.data.neo4j.example.domain" would be fine. The default behaviour is for sub-packages to be scanned 
* and you can also specify fully-qualified class names if you want to cherry pick particular classes. 
* </p> 
* 
* @param packages The packages to scan for domain objects 
*/ 

此外,有一个关于此错误在4.0.0.M1但是根据JIRA的权利要求是,它已被固定为的4.0.0.RC1

https://jira.spring.io/browse/DATAGRAPH-657

这可能仍然是一个错误...为了测试目的,尝试将以下参数传递给SessionFactory。

“server.core.domain.nodes”

server.core.domain.nodes.User

看看是否有错误消失。

+0

它没有工作。根包是正确的,因为我提到持久化实体在核心模块中工作 – Xipo

+0

@Xipo听起来像是一个bug。所以现在我们需要确定测试用例与其他控制器不同的原因。打开包org.springframework.data.neo4j和org.neo4j.ogm的调试日志记录。尝试比较测试用例和其余环境的日志,以确定发生分歧的位置(扫描实体元数据期间)。一旦你进入代码确定它实际上是一个错误,我建议在SDN 4.0 Jira项目页面上提交一个新的错误。 – Selwyn