2013-10-09 14 views
5

Tôi đang sử dụng Jersey: 1.17.1 và xác định dịch vụ REST chấp nhận "application/x-www-form-urlencoded". Tôi muốn chấp nhận một tham số "b" theo định dạng ISO-8601 và cho phép Jersey ánh xạ nó vào một Joda DateTime.Thông số ISO 8601 Jersey Joda Thời gian chuẩn ISO 8601 ở dạng urlencoded

@PUT 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public Response createTask(@FormParam("a") String a, @FormParam("b") DateTime b) { 
... 

nhưng tôi nhận được ngoại lệ này

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) 

gì tôi cần phải làm gì để làm cho công việc này?

Và câu trả lời là: đầu tiên tôi nâng cấp lên JAX-RS 2.0 và sau đó được sử dụng:

@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(); 
     } 

    } 
} 

Trả lời

2

Bạn có thể sử dụng giải pháp tiếp theo:

@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() có định dạng yyyyMMdd.
định dạng phù hợp cho trường hợp của bạn, bạn có thể tìm thấy here
EDIT
Từ Jersey Documentation

Nói chung các loại Java của tham số phương pháp có thể:

  1. Hãy là một loại nguyên thủy;

  2. Có một hàm tạo chấp nhận một đối số String đơn;

  3. Có một phương pháp tĩnh tên valueOf hoặc fromString chấp nhận một đơn Chuỗi luận (xem, ví dụ, Integer.valueOf (String) và java.util.UUID.fromString (String));

  4. Có một thực hiện đăng ký của javax.ws.rs.ext.ParamConverterProvider JAX-RS mở rộng SPI rằng trả về một trường hợp javax.ws.rs.ext.ParamConverter có khả năng chuyển đổi "từ chuỗi" cho kiểu. hoặc

  5. Be List, Set or SortedSet, trong đó T thỏa mãn 2 hoặc 3 ở trên. Bộ sưu tập kết quả là chỉ đọc.

Vì vậy, giải pháp posssible là và . \

Tạo lớp ISODateAsString và sử dụng là như tham số

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

Hoặc sử dụng ParamConverterProviderParamConverter

+0

Cảm ơn bạn đã trả lời. Chắc chắn rồi. Nhưng tôi không thể thuyết phục Jersey làm điều này cho tôi? – Ronald

+0

@Ronald answer được chỉnh sửa – Ilya

+0

@llya: Cảm ơn. Tôi đã phải nâng cấp lên JAX-RS 2 trước nhưng sau đó tôi đã đi với giải pháp 4. – Ronald

Các vấn đề liên quan