当前位置: 首页 > 知识库问答 >
问题:

DateTime上的参数类型不正确

翟曦
2023-03-14

Intellij告诉我updateTime的参数类型不正确。我不熟悉这个错误和@ENumDateForata

    @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等的类型。带批注的参数、字段或属性的类型必须是

> 成为主要类型

有一个接受单个字符串参数的构造函数

具有一个名为 valueOf 或 formString 的静态方法,该方法接受单个 String 参数(例如,请参阅 Integer.valueOf(String))

具有ParamConverterProvider JAX-RS扩展SPI的注册实现,该实现返回能够进行该类型的“格式字符串”转换的ParamConverter实例

是List、Set或SortedSet,其中T满足上面的2、3或4。生成的集合是只读的

共有1个答案

施飞鸿
2023-03-14

我想这是一个老问题,但对于<code>LocalDate</code>,您必须注册<code>ParamConverterProvider</code>的实现,该实现返回<code>ParamConverter</code>实例,该实例能够从<code>String</code>创建<code>LocalDate</code<。

如果您检查< code>ParamConverter的javadoc,您会看到有两个方法:< code > E from String(String value)和< code > String to String(E value)。此外,如果您看到< code > ParamConverterProvider 的文档,您会注意到它有以下方法:< code >

基本上,您必须创建ParamConverter的实现

这里有一个例子:

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 #CLASSIC_DATE_FORMATTER}.
     */
    private static class Java8LocalDateClassicFormatParamConverter implements ParamConverter<LocalDate> {

        @Override
        public LocalDate fromString(String value) {
            return Optional.ofNullable(value)
                    .map(CLASSIC_DATE_FORMATTER::parse)
                    .map(LocalDate::from)
                    .orElse(null);
        }

        @Override
        public String toString(LocalDate value) {
            return CLASSIC_DATE_FORMATTER.format(value);
        }
    }
}

您必须注册此提供程序。在您的资源配置中,您必须包含以下内容:

public class AppConfig extends ResourceConfig {

    public AppConfig() {
        register(Java8TimeParamConverterProvider.class);
    }
}

或者,如果您正在执行包扫描:

public class AppConfig extends ResourceConfig {

    public AppConfig() {
        packages("com.example");
    }
}

(这就是为什么@提供者注释包含在Java8TimeParamConverter提供者类定义中)。请注意,如果您使用Spring启动,这将不起作用,因为目前由Spring启动插件创建的最终jar存在问题。

另一种注册提供商的方法是通过< code>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>

希望这对你有帮助!

 类似资料:
  • 我有一个GET请求电话,如下所示 参数类型错误 下面是请求类: 我不确定我为什么会得到这个。以下是我的IDE的建议。 成为原始类型 有一个接受单个String参数的构造函数 有一个名为valueOf或fromString的静态方法,它接受一个String参数(例如,请参见Integer.valueOf(String)) 具有ParamConverterProvider JAX-RS扩展SPI的注册

  • 因此,我使用附近的连接API来发现我周围的设备,并将它们的数据存储在firestore中,然而,我不断收到2个警告,关于我从我接触的用户那里获得的位置和我接触它们的时间 以下是两个警告: 请问有什么办法吗?

  • 很好的一天。我不熟悉使用VSCode键入脚本。 获取以下错误: > 错误TS2322:类型'()= 代码: DTO。输电系统 LinkedObject.ts 我正在尝试使用上述接口方法实例化类: TravelClientFormPopulator.ts 任何帮助都将不胜感激。

  • 我正在为我的团队和我正在工作的应用程序寻找一些帮助。几个星期以来,我们都面临着以下问题: null 问题不应该来自云Firestore和应用程序之间的链接,因为我们可以获得其他存储的信息。

  • 在我新创建的Angular应用程序中,我尝试使用mattlewis92的Angular日历来创建他的日历。我已经复制了他的github:https://mattlewis92.github.io/Angulat-calendar/#/kitchenter-sink上列出的所有步骤和代码,但我在第一行总是发现一个错误,即指出“{static:boolean;}类型的参数不能分配给{read?:any

  • 我刚刚更新到Dart2和Flatter sdk:' 无法将参数类型“Object”指定给参数类型“ImageProvider”。), 我只是从弗利特开始,不知道该去哪里找别的。