【问题标题】:NotInTransactionException when adding item to a HashSet<E>将项目添加到 HashSet<E> 时出现 NotInTransactionException
【发布时间】:2015-11-10 10:45:36
【问题描述】:

编辑

由于我暂时没有得到答复,而我打开的 github Ticket 有 已关闭,我将在 github 上创建一个示例来重现该错误 找出问题所在。一旦问题得到解决,我将添加我的 自己回答这个问题以提供真正的解决方案。

首先,我将此报告为issue on SDN's Github

无论如何,我在这里发布我的问题,看看是否有人有解决方案。

所以,我有一个 Player 模型:

@NodeEntity
public class Player {

    @GraphId Long id;
    String name;

    String email;

    @Transient
    String password;

    int elo = 1200;
    
    @RelatedTo(type="FRIEND_WITH", direction = Direction.BOTH)
    Set<Player> friends = new HashSet<Player>();

    //After this I have Getters and Setters
    //no need to paste them all I guess
}

及其存储库接口:

@RepositoryRestResource(collectionResourceRel="player", path="player")
public interface PlayerRepository extends PagingAndSortingRepository<Player, Long> {
}

我使用 POST 请求创建了两个播放器,并验证了它们确实是使用 GET 创建的。

然后我想将玩家 0 添加为玩家 1 的朋友:

curl -i -X POST -H 'Content-type: text/uri-list' -d 'localhost:8080/api/player/1' http://localhost:8080/api/player/0/friends

我得到一个例外:

HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
Content-Type: application/hal+json;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 09 Nov 2015 16:20:24 GMT
Connection: close

{
  "timestamp" : "2015-11-09T16:20:24.844+0000",
  "status" : 500,
  "error" : "Internal Server Error",
  "exception" : "org.neo4j.graphdb.NotInTransactionException",
  "message" : "No message available",
  "path" : "/api/player/0/friends"
}

要查看完整的堆栈跟踪,请查看问题顶部的 Github 链接,此处太长无法阅读。

以防万一,这是我的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.afkgames</groupId>
    <artifactId>api-rest-sdn</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.0.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-neo4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <java.version>1.8</java.version>
        <start-class>api.Bootstrap</start-class>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
       <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>neo4j</id>
            <name>Neo4j</name>
            <url>http://m2.neo4j.org/</url>
        </repository>
    </repositories>
        <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginRepository>
    </pluginRepositories>

</project>

编辑: 我试图在我的存储库界面上添加@Transactional,它失败并出现同样的错误。

【问题讨论】:

  • 你可以尝试在你的存储库方法中添加一个@Transactional
  • @MichaelHunger 我试过了,编辑主题以添加答案,但它不起作用:/得到完全相同的异常
  • Yore're 在 curl 调用中使用 POST,这意味着它正在创建新的东西,因此它可能需要事务。您可以发布您的 REST 方法和为 POST 调用的相应 DAO 方法吗? findByName 很可能会在 REST GET 方法中调用,而不是在 POST 中调用,因此它的代码对调试问题没有太大帮助。
  • 这些方法是spring-rest创建的,其实我创建findByname方法只是为了测试,没有这个方法一切正常。
  • 对于spring-boot-starter-parent 版本,请尝试使用“1.3.0.RELEASE”。

标签: neo4j spring-data-neo4j spring-data-rest


【解决方案1】:

[编辑]

尝试更新您的 POM 文件以使用 Spring 框架的 1.3.0.RELEASE 版本。像这样的:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.afkgames</groupId>
    <artifactId>api-rest-sdn</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.0.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-neo4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
    </dependencies>
    <properties>
        <java.version>1.8</java.version>
        <start-class>api.Bootstrap</start-class>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
        <repository>
            <id>neo4j</id>
            <name>Neo4j</name>
            <url>http://m2.neo4j.org/</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </pluginRepository>
    </pluginRepositories>

</project>

【讨论】:

  • 正如我在cmets中回复的,findByName方法在这里只是为了测试,我可以删除它,api可以正常工作。我将编辑问题以删除界面中的方法签名,以避免混淆。
  • 更新了我的回答,建议使用 Spring 框架的 1.3.0.RELEASE 版本。
  • 什么都没有改变,RELEASE还是一样的问题
  • 我能得到你项目的github链接吗,你正在做的任何demo,调试起来都很容易
  • @PrabjotSingh 抱歉迟到了,我没有收到任何通知,因为这不是我的回复^^" 这是您要查找的链接:github.com/Supamiu/sdn4-Issue316-demo
猜你喜欢
  • 1970-01-01
  • 2012-01-28
  • 2011-05-17
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多