Java DateTime上的参数类型不正确
Intellij告诉我,Java DateTime上的参数类型不正确,java,datetime,jax-rs,Java,Datetime,Jax Rs,Intellij告诉我,updateTime的参数类型不正确。我不熟悉此错误和@EnumDateFormat @DELETE @Path("groups/{groupId}/samples/{testYear}") @Produces(MediaType.APPLICATION_JSON) @RolesAllowed({Profile.MP_USER_ROLE}) public Response deleteGroupSamples (
updateTime
的参数类型不正确。我不熟悉此错误和@EnumDateFormat
@DELETE
@Path("groups/{groupId}/samples/{testYear}")
@Produces(MediaType.APPLICATION_JSON)
@RolesAllowed({Profile.MP_USER_ROLE})
public Response deleteGroupSamples (@PathParam("groupId") Long groupId, @PathParam("testYear") Long testYear, @QueryParam("updateTime") @EnumDateFormat( FormatEnum.WITH_HHMMSS ) DateTime updateTime, TreatmentGroupTest sample) throws ValidationException{
manager.deleteGroupSample( this.getUser(), sample.getTestSampleId(), updateTime );
ResponseBuilder builder=null;
builder = Response.ok( );
return builder.build();
}
错误还表明:
检查参数@PathParam、@QueryParam等的类型。带注释的参数、字段或属性的类型必须为
我想这是一个老问题,但是对于
LocalDate
来说,必须注册ParamConverterProvider
的实现,该实现返回一个ParamConverter
实例,该实例能够从字符串创建LocalDate
如果您检查javadoc中的ParamConverter
,您将看到有两种方法:E fromString(String value)
和String toString(E value)
。
另外,如果您看到ParamConverterProvider
的文档,您会注意到它有以下方法:ParamConverter getConverter(类rawType,类型genericType,注释注释[])
基本上,您必须创建ParamConverter
的实现,该实现可以从字符串创建LocalDate
,然后从注册的ParamConverterProvider
返回该实现的实例
以下是一个例子:
package com.example;
import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Optional;
/**
* The {@link ParamConverterProvider} for {@link java.time} package classes
* (i.e {@link LocalDate}, {@link LocalTime} and {@link LocalDateTime}).
*/
@Provider
public class Java8TimeParamConverterProvider implements ParamConverterProvider {
/**
* Contains a {@link DateTimeFormatter} whose pattern is "yyyy-MM-dd".
*/
public static final DateTimeFormatter CLASSIC_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation[] annotations) {
if (rawType == LocalDate.class) {
//noinspection unchecked
return (ParamConverter<T>) new Java8LocalDateClassicFormatParamConverter();
}
if (rawType == LocalTime.class) {
return null; // TODO: implement
}
if (rawType == LocalDateTime.class) {
return null; // TODO: implement
}
return null;
}
/**
* The {@link ParamConverter} for {@link LocalDate} using the {@link Formatters#CLASSIC_DATE_FORMATTER}.
*/
private static class Java8LocalDateClassicFormatParamConverter implements ParamConverter<LocalDate> {
@Override
public LocalDate fromString(String value) {
return Optional.ofNullable(value)
.map(Formatters.CLASSIC_DATE_FORMATTER::parse)
.map(LocalDate::from)
.orElse(null);
}
@Override
public String toString(LocalDate value) {
return Formatters.CLASSIC_DATE_FORMATTER.format(value);
}
}
}
或者,如果您正在进行软件包扫描:
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("com.example");
}
}
(这就是@Provider
注释包含在Java8TimeParamConverterProvider
类定义中的原因)。请注意,如果您使用的是SpringBoot,这将不起作用,因为目前SpringBoot插件创建的最终jar存在问题
另一种注册提供商的方法是通过web.xml
。在这种情况下,您必须包括以下内容:
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Include the following init-param if you want to do package scanning -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
com.example
</param-value>
</init-param>
<!-- Or use the following init-param if you want to do class register -->
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.example.Java8TimeParamConverterProvider</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
泽西servlet
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.example
jersey.config.server.provider.classnames
com.example.Java8TimeParamConverterProvider
1.
希望这对你有帮助 那么,数字1和5不适用于DateTime,所以请检查其余部分。我不认为有valueOf方法或带字符串的构造函数,所以剩下的是数字4@cricket_007不知道这意味着什么,但谢谢你的建议!你引用的“建议”。读一遍?您知道“primitive”是什么意思吗?或者valueOf
指的是什么?基本上,问题在于DateTime
可以是任何格式,而JAX-RS无法为您处理这一点。如果您向端点发送一个普通字符串,该字符串必须与预期的日期格式相匹配(hh:mm:ss
),这会更有意义。是的,我读过它们,知道原语和值的含义lol。错误建议4是我完全不了解的。但你的解释更简单,所以我理解。
<servlet>
<servlet-name>jersey-servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Include the following init-param if you want to do package scanning -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>
com.example
</param-value>
</init-param>
<!-- Or use the following init-param if you want to do class register -->
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.example.Java8TimeParamConverterProvider</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>