如何配置项目以将 JSON 提供程序与 jersey-restful 网络服务一起使用
How to configure a project to use a JSON provider with jersey-restful web services
我正在尝试创建一个 restful-jersey 网络服务。我必须将 JSON 对象传递给网络服务。
@POST
@Path("/saveVehicleTrackingData")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String saveVehicleTrackingData(VehicleTracking vehicleTracking) {
return vehicleTracking.toString();
}
我为项目添加 json 提供程序所做的唯一一件事就是添加了这个 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.
但是自动注册不工作,我在尝试访问网络服务时收到 415-Unsupported Media Type 错误。是否有关于如何正确注册 json 提供商的指南?
要使 "auto-registration" 正常工作,需要将应用配置为扫描整个类路径。这可能不是最优的,大多数示例甚至不会提及如何执行此操作。但一种方法是不使用 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
子类,您可以 register(JacksonJsonProvider.class)
或 register(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>
并且没有任何其他配置,它会自动注册。实际上,此依赖项使用您在 post 中提到的依赖项,但使用 Jersey 特定的自动发现功能来注册它。
我正在尝试创建一个 restful-jersey 网络服务。我必须将 JSON 对象传递给网络服务。
@POST
@Path("/saveVehicleTrackingData")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String saveVehicleTrackingData(VehicleTracking vehicleTracking) {
return vehicleTracking.toString();
}
我为项目添加 json 提供程序所做的唯一一件事就是添加了这个 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.
但是自动注册不工作,我在尝试访问网络服务时收到 415-Unsupported Media Type 错误。是否有关于如何正确注册 json 提供商的指南?
要使 "auto-registration" 正常工作,需要将应用配置为扫描整个类路径。这可能不是最优的,大多数示例甚至不会提及如何执行此操作。但一种方法是不使用 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
子类,您可以 register(JacksonJsonProvider.class)
或 register(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>
并且没有任何其他配置,它会自动注册。实际上,此依赖项使用您在 post 中提到的依赖项,但使用 Jersey 特定的自动发现功能来注册它。