Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DateTime上的参数类型不正确_Java_Datetime_Jax Rs - Fatal编程技术网

Java DateTime上的参数类型不正确

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 (

Intellij告诉我,
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等的类型。带注释的参数、字段或属性的类型必须为

  • 属于灵长类

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

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

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

  • 是列表、集合或分类集合,其中T满足上述2、3或4。生成的集合是只读的


  • 我想这是一个老问题,但是对于
    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>