Java 在neo4j服务器扩展中使用JSON

Java 在neo4j服务器扩展中使用JSON,java,neo4j,jersey,jackson,jax-rs,Java,Neo4j,Jersey,Jackson,Jax Rs,我正在构建一个Neo4j(2.2.2)非托管扩展,当我发布具有正确格式的JSON正文和内容类型:application/JSON头的请求时,我不明白为什么下面的方法会抛出415:unsupported media type @POST @Path("/create") @Consumes(MediaType.APPLICATION_JSON) public Response createFoo(FooBar input) { //not relevant } 这是我

我正在构建一个Neo4j(2.2.2)非托管扩展,当我发布具有正确格式的JSON正文和
内容类型:application/JSON
头的请求时,我不明白为什么下面的方法会抛出
415:unsupported media type

@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_JSON)
public Response createFoo(FooBar input) {
      //not relevant        
}
这是我希望JSON映射到的
FooBar
类:

@XmlRootElement
public class FooBar implements Serializable {
    String title;    
    public FooBar(){}
}
这是我日志中的消息:

`SEVERE: A message body reader for Java class org.mycompany.myproject.FooBar, and Java type class     
org.mycompany.myproject.FooBar, and MIME media type application/json was not found.
The registered message body readers compatible with the MIME media type are:
** ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider      
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
....
在查看了类似问题的其他SO答案后,我已经包含了相应版本的
jersey json
,并确认它已包含在我的jar中

这是我的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.mycompany</groupId>
<artifactId>myproject</artifactId>
<version>1.0</version>

<dependencies>
    <dependency>
        <groupId>javax.ws.rs</groupId>
        <artifactId>javax.ws.rs-api</artifactId>
        <version>2.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j</artifactId>
        <version>2.2.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.neo4j.test</groupId>
        <artifactId>neo4j-harness</artifactId>
        <version>2.2.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-kernel</artifactId>
        <version>2.2.2</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>neo4j-io</artifactId>
        <version>2.2.2</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.neo4j.app</groupId>
        <artifactId>neo4j-server</artifactId>
        <version>2.2.2</version>
    </dependency>
    <dependency>
        <groupId>org.neo4j.app</groupId>
        <artifactId>neo4j-server</artifactId>
        <version>2.2.2</version>
        <type>test-jar</type>
    </dependency>
    <dependency>
        <groupId>org.neo4j</groupId>
        <artifactId>server-api</artifactId>
        <version>2.2.2</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.13</version>
    </dependency>
    <dependency>
        <groupId>com.github.javafaker</groupId>
        <artifactId>javafaker</artifactId>
        <version>0.5</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.13</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.18.1</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>org.mycompany.myproject.mymainclassg</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
        </plugin>


    </plugins>
</build>

4.0.0
org.mycompany
我的项目
1
javax.ws.rs
javax.ws.rs-api
2
假如
org.neo4j
neo4j
2.2.2
假如
org.codehaus.jackson
杰克逊地图绘制者
1.9.13
假如
org.neo4j.test
neo4j线束
2.2.2
假如
org.neo4j
neo4j核
2.2.2
试验罐
测试
org.neo4j
neo4j io
2.2.2
试验罐
测试
org.neo4j.app
neo4j服务器
2.2.2
org.neo4j.app
neo4j服务器
2.2.2
试验罐
org.neo4j
服务器api
2.2.2
朱尼特
朱尼特
4.11
测试
org.hamcrest
汉克雷斯特酒店
1.3
测试
org.glassfish.jersey.media
泽西媒体公司
2.13
com.github.javafaker
爪哇骗子
0.5
org.glassfish.jersey.media
泽西媒体公司
2.13
泽西岛
泽西json
1.18.1
org.apache.maven.plugins
maven编译器插件
2.4
1.7
1.7
maven汇编插件
2.4
org.mycompany.myproject.mymainclassg
带有依赖项的jar

注:Neo4j 2.2.2运行泽西1.18.1


更新:在@StefanArmbruster的建议下,我尝试将jersey media json jackson添加到构建中,无论是否使用jersey json依赖项,但仍然存在相同的问题

我通过添加到项目的构建中获得了一些良好的经验


另外,请确保部署带有依赖项的jar,或者将依赖项单独安装到Neo4j的
plugins
文件夹中。

与Jersey的捆绑相比,直接包含Jackson JAX-RS provider通常更简单:

(适用于JSON,但也适用于XML、Smile或CBOR)


仅仅通过Maven依赖项包含提供者jar就足够了(jar有META-INF/服务自动注册元数据);它确实依赖于Jackson 2.x(Jackson-databind),您可能还需要添加一个显式依赖项。

我也遇到了同样的问题,并通过将其包含到扩展JAR中进行了修复。检查my
pom.xml
(忽略不必要的部分):


org.glassfish.jersey.media
泽西媒体公司
2.22.1
maven编译器插件
3.1
1.7
1.7
UTF-8
org.apache.maven.plugins
maven阴影插件
2.4.2
包裹
阴凉处
org.neo4j
org.neo4j*
javax.ws.rs-api
朱尼特

Maven Shade插件用于将JSON提供程序包含到JAR文件中。

感谢您尝试了一下,但我尝试将jersey media JSON jackson添加到构建中(有无jersey JSON依赖项),并且仍然抛出415。另外,我正在部署带有依赖项的jar,并且已经确认我的另一个依赖项(JavaFaker)正在按预期加载到扩展中。。。还有其他想法吗?这是我的拦路虎。。。(参见更新的pom.xml的编辑文章)你能在github上建立一个可编译的项目吗,这样我们就可以自己尝试了?@MichaelHunger-我现在通过直接包括jackson jaxrs提供商来修复它,但是的,我会在有机会的时候这样做,因为我想弄清楚到底发生了什么here@StaxMan,我使用的是neo4j 3.0.3,,我也得到不受支持的媒体类型,如OP。。。因此,我遵循上面的方法,将其粘贴到pom.xml中,但在日志中,它说:由以下原因引起:java.lang.VerifyError:class com.fasterxml.jackson.databind.ext.CoreXMLDeserializers$Std覆盖反序列化的最终方法(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object;可能会出什么问题?Thanks@WantIt这是不兼容(次要)版本的标志。。。然而,由于这两个类都来自
jackson-databind
,也许实际上在类路径中存在
jackson-databind
jar两次的问题?
<dependencies>
    <!-- neo4j dependencies here -->

    <!-- javax.ws.rs dependency -->

    <!-- junit dependency -->

    <!-- JSON provider -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.22.1</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <!-- Compiler plugin -->
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>

        <!-- Maven Shade Plugin -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.2</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <artifactSet>
                            <!-- Exlude all the dependencies except jersey-media-json-jackson -->
                            <excludes>
                                <exclude>org.neo4j</exclude>
                                <exclude>org.neo4j.*</exclude>
                                <exclude>javax.ws.rs-api</exclude>
                                <exclude>junit</exclude>
                            </excludes>
                        </artifactSet>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>