我正在使用Jersey:1.17.1,并定义了一个接受"application/x-www-form-urlencoded"的REST服务。我想接受ISO-8601格式的参数"b",并让泽西岛将其映射到Joda DateTime。
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createTask(@FormParam("a") String a, @FormParam("b") DateTime b) {
...
但我收到此异常
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: Missing dependency for method public de.ast.mae.rest.util.response.Response de.ast.mae.rest.service.tasks.TasksAdminRestService.createTask(java.lang.String,org.joda.time.DateTime) at parameter at index 6
SEVERE: Missing dependency for method public de.ast.mae.rest.util.response.Response de.ast.mae.rest.service.tasks.TasksAdminRestService.createTask(java.lang.String,org.joda.time.DateTime) at parameter at index 6
SEVERE: Method, public de.ast.mae.rest.util.response.Response de.ast.mae.rest.service.tasks.TasksAdminRestService.createTask(java.lang.String,java.lang.String,org.joda.time.DateTime), annotated with PUT of resource, class de.ast.mae.rest.service.tasks.TasksAdminRestService, is not recognized as valid resource method.
Okt 09, 2013 5:54:41 PM com.sun.jersey.spi.spring.container.servlet.SpringServlet initiate
SEVERE: Exception occurred when intialization
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136)
我需要做什么才能完成这项工作?
答案是:我首先升级到 JAX-RS 2.0,然后使用:
@Provider
public class DateTimeParamConverterProvider implements ParamConverterProvider {
@Override
public <T> ParamConverter<T> getConverter(Class<T> type, Type genericType, Annotation[] annotations) {
if (type.equals(DateTime.class)) {
return (ParamConverter<T>) new DateTimeParamConverter();
} else {
return null;
}
}
private static class DateTimeParamConverter implements ParamConverter<DateTime> {
@Override
public DateTime fromString(String value) {
try {
return ISODateTimeFormat.dateTimeNoMillis().parseDateTime(value);
} catch (IllegalArgumentException e) {
return ISODateTimeFormat.dateTime().parseDateTime(value);
}
}
@Override
public String toString(DateTime value) {
return value.toString();
}
}
}
您可以使用下一个解决方案:
@PUT
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createTask(@FormParam("a") String a, @FormParam("b") String b)
{
final DateTime date = ISODateTimeFormat.basicDate().parse(b);
// ...
basicDate()
有格式yyyyMMdd
。
您可以在此处
找到适合您情况的格式编辑
来自泽西岛文档
通常,方法参数的 Java 类型可以:
是基元类型;
有一个接受单个字符串参数的构造函数;
具有一个名为 valueOf 或 fromString 的静态方法,该方法接受单个 字符串参数(例如,请参阅 Integer.valueOf(String( 和 java.util.UUID.fromString(String((;
已注册实现 javax.ws.rs.ext.ParamConverterProvider JAX-RS extension SPI 那 返回一个 javax.ws.rs.ext.ParamConverter 实例,该实例能够"from 字符串"类型的转换。或
是列表、设置或排序集,其中 T 满足上述 2 或 3。 生成的集合是只读的。
因此,可能的解决方案是 2 和 4。
创建类ISODateAsString
并使用 is 作为参数
public class ISODateAsString
{
DateTime dateTime;
public DateAsString(String date)
{
dateTime= ISODateTimeFormat.basicDate().parse(date);
}
//...
}
或者使用ParamConverterProvider
和ParamConverter