2015-11-03 72 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