5

私は Jersey: 1.17.1 を使用しており、「application/x-www-form-urlencoded」を受け入れる REST サービスを定義しています。ISO-8601 形式のパラメータ「b」を受け入れ、Jersey がこれを 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();
        }

    }
}
4

1 に答える 1

2

次の解決策を使用できます。

@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 型は次のようになります。

  1. プリミティブ型であること。

  2. 単一の String 引数を受け入れるコンストラクターを用意します。

  3. 単一の文字列引数を受け入れる valueOf または fromString という名前の静的メソッドを用意します (たとえば、Integer.valueOf(String) および java.util.UUID.fromString(String) を参照)。

  4. 型の「文字列から」の変換が可能な javax.ws.rs.ext.ParamConverter インスタンスを返す javax.ws.rs.ext.ParamConverterProvider JAX-RS 拡張 SPI の実装を登録します。また

  5. List、Set、または SortedSet で、T は上記の 2 または 3 を満たします。結果のコレクションは読み取り専用です。

したがって、考えられる解決策は24です。\

クラスISODateAsStringを作成し、パラメータとして使用します

public class ISODateAsString
{
   DateTime dateTime;
   public DateAsString(String date)
   {
      dateTime= ISODateTimeFormat.basicDate().parse(date);
   }
   //...
}  

または使用ParamConverterProviderしてParamConverter

于 2013-10-09T21:17:38.650 に答える