Java 使用uberjar中的Jersey和Jackson时不支持的媒体类型
我目前面临着Jersey和Jackson的一个问题,我找不到解决方案:当我试图在Jersey端点中将一个从JSON序列化的POJO作为POST参数时,如果我从uberjar调用它,它将返回一个错误。如果在从eclipse启动main方法之后使用相同的wget调用,那么一切都会正常工作,并得到预期的答案。我搜索过其他在使用jersey和post参数应用程序类型时遇到问题的人,如和,但主要错误是他们没有在调用中指定标题或使用错误的@Consumes标记,我没有。根据我的研究,没有人会遇到类似的问题:当服务器从eclipse启动时,调用可以工作,但当服务器从外部启动时,调用不能工作 启动服务器的类如下所示: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标记,我没有。根据我的研究,没有人会遇到类似的问题:
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
,因为它提供了类重定位功能,以避免类路径中出现相同的类名冲突。