Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用uberjar中的Jersey和Jackson时不支持的媒体类型_Java_Json_Eclipse_Rest_Maven - Fatal编程技术网

Java 使用uberjar中的Jersey和Jackson时不支持的媒体类型

Java 使用uberjar中的Jersey和Jackson时不支持的媒体类型,java,json,eclipse,rest,maven,Java,Json,Eclipse,Rest,Maven,我目前面临着Jersey和Jackson的一个问题,我找不到解决方案:当我试图在Jersey端点中将一个从JSON序列化的POJO作为POST参数时,如果我从uberjar调用它,它将返回一个错误。如果在从eclipse启动main方法之后使用相同的wget调用,那么一切都会正常工作,并得到预期的答案。我搜索过其他在使用jersey和post参数应用程序类型时遇到问题的人,如和,但主要错误是他们没有在调用中指定标题或使用错误的@Consumes标记,我没有。根据我的研究,没有人会遇到类似的问题:

我目前面临着Jersey和Jackson的一个问题,我找不到解决方案:当我试图在Jersey端点中将一个从JSON序列化的POJO作为POST参数时,如果我从uberjar调用它,它将返回一个错误。如果在从eclipse启动main方法之后使用相同的wget调用,那么一切都会正常工作,并得到预期的答案。我搜索过其他在使用jersey和post参数应用程序类型时遇到问题的人,如和,但主要错误是他们没有在调用中指定标题或使用错误的@Consumes标记,我没有。根据我的研究,没有人会遇到类似的问题:当服务器从eclipse启动时,调用可以工作,但当服务器从外部启动时,调用不能工作

启动服务器的类如下所示:

public class ServerStarter {
    public static final String BASE_URI = "http://localhost:8282/test/";

    public static void main(String[] args) throws IOException {
        final ResourceConfig rc = new ResourceConfig().packages("starter");
        HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
        System.out.println(String.format("Drücke Enter um Server zu beenden.", BASE_URI));
        System.in.read();
        server.stop();
    }
}
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-grizzly2-http</artifactId>
        <version>2.13</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.13</version>
    </dependency>
端点如下所示:

@Path("testme")
public class Endpoint {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String testMe(Parameters ep) {
        return ep.toString();
    }
}
public class Parameters {
    private int x;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }
}
参数类应该是POJO,如下所示:

@Path("testme")
public class Endpoint {

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public String testMe(Parameters ep) {
        return ep.toString();
    }
}
public class Parameters {
    private int x;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }
}
如果我执行mvn clean package assembly:single,启动服务器,然后调用
wget localhost:8282/test/testme--post data='{“x”:10}'--header=“Content Type:application/json”
,它将返回
415不支持的媒体类型

pom.xml中的依赖项如下所示:

public class ServerStarter {
    public static final String BASE_URI = "http://localhost:8282/test/";

    public static void main(String[] args) throws IOException {
        final ResourceConfig rc = new ResourceConfig().packages("starter");
        HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
        System.out.println(String.format("Drücke Enter um Server zu beenden.", BASE_URI));
        System.in.read();
        server.stop();
    }
}
    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-grizzly2-http</artifactId>
        <version>2.13</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.13</version>
    </dependency>

org.glassfish.jersey.containers
jersey-container-grizzly2-http
2.13
org.glassfish.jersey.media
泽西媒体公司
2.13

有人知道如何解决这个问题吗?我没有线索,据我所想,eclipse的调用应该与uberjar中的调用类似。

这个问题是由JAR提供的服务()引起的。虽然eclipse正确地组合了它们,但uberjar插件使它们相互覆盖。一种可能的解决方案是使用maven assembly插件,使用以下程序集描述符:

<assembly>
    <id>production</id>
    <formats>
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>    
    <dependencySets>
        <dependencySet>
            <useProjectArtifact>false</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>

    <fileSets>
        <fileSet>
            <directory>${project.build.directory}/classes</directory>
            <outputDirectory>classes</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

生产
迪尔
假的
假的
解放党
假的
${project.build.directory}/classes
班级

之后,可以使用
java-cp lib/:classes/MainClass
启动应用程序。David分析是正确的。我只想添加一个替代解决方案。您可以将Maven Shade插件与
ServicesResourceTransformer
一起使用,例如

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <createDependencyReducedPom>false</createDependencyReducedPom>
        <transformers>
            <!-- To ensure the original META-INF/services definitions are respected -->
            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
            <transformer
                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>id.web.michsan.hellotransfer.Application</mainClass>
            </transformer>
        </transformers>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

org.apache.maven.plugins
maven阴影插件
3.2.1
假的
id.web.michsan.hellotransfer.Application
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
包裹
阴凉处

也许自JAX-RS 1.0以来语法发生了变化,但不应该是@Consumes值中的字符串数组,例如
@Consumes({MediaType.APPLICATION_JSON})
?我在Jetty上遇到了类似的问题:我也遇到了同样的问题,我可以使用Thank you的提示来修复它,但不幸的是,这是一个打包问题,而不是jersey问题,因此手动激活jackson功能不会改变任何东西。仅供参考,您可以使用
Maven Shade plugin
而不是
Maven assembly plugin
,因为它提供了类重定位功能,以避免类路径中出现相同的类名冲突。