我正在尝试创建一个restful-jersey Web服务.我必须将JSON对象传递给Web服务.
@POST
@Path("/saveVehicleTrackingData")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String saveVehicleTrackingData(VehicleTracking vehicleTracking) {
return vehicleTracking.toString();
}
我向项目添加json provider的唯一方法是添加了以下maven依赖项:
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.5.1</version>
</dependency>
如this page所说:
Due to auto-registration, it should be possible to simply add Maven
dependency (or include jar if using other build systems) and let JAX-RS
implementation discover provider. If this does not work you need to consult
documentation of the JAX-RS implementation for details.
但是自动注册无法正常工作,尝试访问Web服务时出现415-不支持的媒体类型错误.是否有任何有关如何正确注册json提供程序的指南?
解决方法:
为了使“自动注册”工作,需要将应用配置为扫描整个类路径.这可能不是最佳选择,大多数示例甚至都没有提到如何做到这一点.但是一种方法是不使用web.xml,而使用带有@ApplicationPath批注的空Application子类.
@ApplicationPath("/api")
public class JerseyConfig extends Application {}
这足以启用类路径扫描.也许还有其他方法,但是通常您会看到使用的是程序包扫描.在您的web.xml中,您可能会看到类似
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>your.package.to.scan</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
这将扫描your.package.to.scan软件包.如果您希望它扫描Jackson类,则可以在列表中添加软件包,即
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
your.package.to.scan,
com.fasterxml.jackson.jaxrs.json
</param-value>
如果使用的是ResourceConfig子类,则可以注册(JacksonJsonProvider.class)或注册(JacksonJaxbJsonProvider.class)以获得JAXB注释支持.
如果使用的是Application子类,则可以在重写的getSingletons()方法中添加提供程序的实例.
顺便说一句,如果您使用的是Jersey 2.9,则可以只使用this dependency
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey2.version}</version>
</dependency>
并且无需任何其他配置,它将自动注册.实际上,此依赖关系使用您在文章中提到的依赖关系,但使用Jersey特定的Auto Discoverable功能进行注册.