2017-02-22 80 views
1

Intellij сообщает мне, что updateTime имеет неправильный тип параметра. Я не знаком с этой ошибкой и @EnumDateFormat.Неверный тип параметра в DateTime

@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 и т.д. тип аннотированный параметра, поля или свойства должны либо

  1. быть primative type

  2. Имейте конструктор, который принимает единственный аргумент String

  3. Есть статический метод valueOf или formString, который принимает один аргумент типа String (см, например, Integer.valueOf (String))

  4. Иметь зарегистрированную реализацию ParamConverterProvider расширения JAX-RS SPI, который возвращает Экземпляр ParamConverter, способный к преобразованию типа «формы» этого типа

  5. Be List, Set or SortedSet, где T удовлетворяет 2, 3 или 4 выше. В результате коллекция только для чтения

+0

Ну, цифры 1 и 5 не относятся к DateTime, поэтому проверьте остальные. Я не думаю, что есть метод valueOf или конструктор со строкой, так что оставляет номер 4 –

+0

@ cricket_007 не знаю, что это значит, но спасибо за предложение! – Drew13

+1

Ваши «предложения», которые вы указали. Прочитайте их? Знаете ли вы, что означает «примитивный» или «valueOf»? По сути, проблема в том, что 'DateTime' может буквально быть любым форматом *, и JAX-RS не может справиться с этим для вас. Для вас было бы более разумно отправить обычную строку в вашу конечную точку, которая должна соответствовать вашему ожидаемому формату даты ('hh: mm: ss') –

ответ

1

Я думаю, что это старый вопрос, но LocalDate вы должны зарегистрировать реализацию ParamConverterProvider, которая возвращает ParamConverter экземпляр, который способен создать LocalDate из String.

Если вы проверите javadoc на ParamConverter, вы увидите, что существует два метода: E fromString(String value) и String toString(E value). Кроме того, если вы видите документацию для ParamConverterProvider, вы заметите, что она имеет следующий метод: <T> ParamConverter<T> getConverter(Class<T> rawType, Type genericType, Annotation annotations[]).

В принципе, вы должны создать реализацию ParamConverter<LocalDate>, что может создать LocalDate из String, а затем вернуть экземпляр этого осуществления от зарегистрированного 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); 
     } 
    } 
} 

Вы должны зарегистрировать поставщика. В вашей ResourceConfig вы должны включать следующее:

public class AppConfig extends ResourceConfig { 

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

Или, если вы делаете сканирование пакетов:

public class AppConfig extends ResourceConfig { 

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

(Вот почему @Provider аннотацию входит в определение Java8TimeParamConverterProvider класса). Обратите внимание, что это не сработает, если вы используете весеннюю загрузку, так как в данный момент есть проблемы с последней банкой, созданной плагином для загрузки весны.

Другой способ зарегистрировать поставщика услуг - 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> 

Надеюсь, это вам поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^