我有以下GET
REST方法:
import java.time.OffsetDateTime;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import com.product.rest.api.TransactionsApi;
import com.product.rest.model.Transaction;
@Path("/transactions")
@Api(description = "the transactions API")
@Consumes({ "application/json" })
@Produces({ "application/json" })
public class TransactionsApiImpl extends TransactionsApi {
@GET
@Consumes({ "application/json" })
@Produces({ "application/json" })
@ApiOperation(value = "", notes = "Get all transactions", response = Transaction.class, responseContainer = "List", tags = {})
@ApiResponses(
value = { @ApiResponse(code = 200, message = "OK", response = Transaction.class, responseContainer = "List"),
@ApiResponse(code = 400, message = "Bad Request", response = Transaction.class, responseContainer = "List"),
@ApiResponse(code = 404, message = "Not Found", response = Transaction.class, responseContainer = "List"),
@ApiResponse(code = 500, message = "Internal Server Error", response = Transaction.class, responseContainer = "List") })
@Override
public Response transactionsGet(
@HeaderParam("tok") String tok,
@QueryParam("param1") Integer param1,
@QueryParam("param2") String param2,
@QueryParam("param3") OffsetDateTime param3,
@QueryParam("param4") OffsetDateTime param4,
@QueryParam("param5") Integer param5,
@QueryParam("param6") Integer param6,
@QueryParam("param7") String param7) {
return Response.ok().entity("Success!").build();
}
该TransactionsApi
是用扬鞭代码生成一个生成的实现,因为是Transaction
模型类。我在此类中还有其他几个函数,但是每当我对该GET /transactions
函数进行注释时,都会出现以下错误:
WARN [Thread-1] (ContextHandler.java:2175) - unavailable
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response
com.product.rest.impl.v1.TransactionsApiImpl.transactionsGet(java.lang.String,java.lang.Integer,java.lang.String,java.time.OffsetDateTime,java.time.OffsetDateTime,java.lang.Integer,java.lang.Integer,java.lang.String) at index 3.; source='ResourceMethod{httpMethod=GET, consumedTypes=[application/json], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.product.rest.impl.v1.TransactionsApiImpl, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@7df78e88]}, definitionMethod=public javax.ws.rs.core.Response
我发现的所有其他类似问题都MultiPart Data
与文件上传有关,而我正在提出一个简单的GET
请求。也使用javax.ws.rs.code.Response
该类的其他函数没有此问题,并且服务器正常启动。
我注意到,只要OffsetDateTime
类在参数中(即param3
和param4
),都会发生此问题,但是我一直无法找出原因。而且,它OffsetDateTime
是由Swagger
Codegen选择的,我不愿意更改它,因为我以后每次重新生成源代码时都将不得不更改每个派生文件。
有没有人在使用REST服务之前遇到过这个问题OffsetDateTime
?
我发现的所有其他类似问题都与MultiPart数据和文件上传有关
有关系
该错误是当Jersey无法验证资源模型时遇到的一般错误。资源模型的一部分是方法参数。泽西岛有一个系统可以知道它将处理哪些参数,而不会处理哪些参数。在您的情况下,它不知道如何处理OffsetDateTime
。
为了能够将非基本类型用作@QueryParam
s(以及所有其他@XxxParams
诸如@PathParam
and
@FormParam
等),需要遵循一组规则:
String
参数的构造函数valueOf
或的静态方法fromString
,该方法接受单个String参数(例如,参见Integer.valueOf(String)
)ParamConverterProvider
JAX-RS扩展SPI的实现,该实现返回一个ParamConverter
能够对该类型进行“从字符串”转换的实例。List<T>
,Set<T>
或者SortedSet<T>
,其中,T
满足2,3或4个以上。结果集合是只读的。因此,在这种情况下OffsetDateTime
,就在列表中;这不是原始的;它没有String构造函数;它没有静态valueOf
或fromString
因此,基本上,剩下的唯一选择就是为其实现a ParamConverter/ParamConverterProvider
。基本设置看起来像
@Provider
public class OffsetDateTimeProvider implements ParamConverterProvider {
@Override
public <T> ParamConverter<T> getConverter(Class<T> clazz, Type type, Annotation[] annotations) {
if (clazz.getName().equals(OffsetDateTime.class.getName())) {
return new ParamConverter<T>() {
@SuppressWarnings("unchecked")
@Override
public T fromString(String value) {
OffsetDateTime time = ...
return (T) time;
}
@Override
public String toString(T time) {
return ...;
}
};
}
return null;
}
}
Jersey将为您传递查询参数的String值,创建并返回它是您的工作。
然后只需OffsetDateTimeProvider
在应用程序中注册。如果您使用的是包裹扫描,则应从@Provider
注释中提取并自动注册它。
我不使用Swagger,所以我不知道他们是否已经提供了已经实现的功能,但是奇怪的是他们会为您生成此功能,而没有办法使其工作。我知道Jersey
3将提供Java 8支持,但是谁知道什么时候发布。
是使用Swagger Codegen生成的实现,模型类也是如此。我在这个类中还有几个其他函数,但每当我将函数保留为未注释状态时,就会收到以下错误: 我发现的所有其他类似的问题都与和文件上载有关,而我只是提出一个简单的请求。其他同样使用类的函数没有这个问题,服务器正常启动。 我注意到,每当类在参数中时(即和)就会出现问题,但我一直无法找出原因。此外,是由Swagger Codegen选择的,我不愿意
问题内容: 我正在使用基于Jersey的Restful Service实施策略来构建将用于上传文件的服务。我的服务类名称是:UploadFileService.java(请参见下面的代码) 这些是我在lib中拥有的JAR文件: 尝试启动tomcat服务器时出现以下错误: org.glassfish.jersey.server.model.ModelValidationException: Vali
我正在创建一个web服务,其中嵌入了Jersey和Jetty,没有web.xml文件。它很简单,它通过一个HTML表单的POST接收一个二进制文件。看来我没有正确注册MultiPart特性,因为当我尝试将它与HTML表单一起使用时,我会出现以下错误: multipart_form_data:未找到public javax.ws.rs.core.response类型参数的注入源 多部分formdat
我正在尝试使用multipart/form-data为JAX-RS上传文件。当我尝试启动服务器时,它会给我以下错误: 是不是缺少了什么,或者配置不正确?我是个新手,所以对我宽容点...:)
我正在使用基于Jersey的restful服务实现策略来构建一个用于上传文件的服务。我的服务类名是:UploadFileService.java(参见下面的代码)
问题总结:我想传递一个带有类型参数(如