如何将Calendar param作为输入传递给rest服务?

时间:2012-12-05 04:31:20

标签: rest date jax-rs jboss7.x resteasy

以下是我要做的事情:

@POST
@Path("/MyPath")
@Produces("text/xml")
@RolesAllowed({"user"})
public Output myMethod (@QueryParam("itemId") long ItemId, 
                                    @QueryParam("plannedstartdate") Calendar plannedStartDate, 
                                    @QueryParam("plannedreturndate") Calendar plannedReturnDate)

我正在使用JBoss AS7。据我所知,resteasy已集成到JBoss AS7中。我能够运行简单的休息服务。

我找到的关于传递日期的唯一文档位于以下链接: http://docs.jboss.org/resteasy/2.0.0.GA/userguide/html/StringConverter.html#StringParamUnmarshaller

由于说明不明确,我无法遵循此并解决问题。 当我尝试创建示例中给出的注释DateFormat时,它无法识别StringParamUnmarshaller。我不知道从哪里得到它。如果resteasy已经集成到JBoss AS7中,这不应该被识别吗?

我的pom.xml具有以下依赖关系:

  <!-- Import the JAX-RS API, we use provided scope as the API is included 
     in JBoss AS 7 -->
  <dependency>
     <groupId>org.jboss.spec.javax.ws.rs</groupId>
     <artifactId>jboss-jaxrs-api_1.1_spec</artifactId>
     <scope>provided</scope>
  </dependency>

对此方法的调用失败,因为没有发生String to Calendar转换。我不想传递String而不是Calendar,因为有其他客户端直接调用java。任何人都可以帮助我如何将日期传递给Rest Calls吗?

由于 韦埃尔

2 个答案:

答案 0 :(得分:5)

此问题已解决。请参阅以下代码。

创建注释类CalendarFormat.java

@Retention(RUNTIME)
@StringParameterUnmarshallerBinder(CalendarFormatter.class)
public @interface CalendarFormat {
    String value();
}

添加课程CalendarFormatter.java

public class CalendarFormatter implements StringParameterUnmarshaller<Calendar> {
    private SimpleDateFormat formatter;

    public void setAnnotations(Annotation[] annotations) {
        CalendarFormat format = FindAnnotation.findAnnotation(annotations, CalendarFormat.class);
        formatter = new SimpleDateFormat(format.value());
    }

    public Calendar fromString(String str) {
        try {
            Calendar cal = Calendar.getInstance();
            cal.setTime(formatter.parse(str));
            return cal;
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

添加到POM

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>2.3.3.Final</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-multipart-provider</artifactId>
    <version>2.3.4.Final</version>
    <exclusions>
        <exclusion>
            <artifactId>resteasy-jaxrs</artifactId>
            <groupId>org.jboss.resteasy</groupId>
        </exclusion>
    </exclusions>
</dependency>

更改方法签名以使用注释

@POST
@Path("/MyPath")
@Produces("text/xml")
@RolesAllowed({"user"})
public Output myMethod(@QueryParam("itemId") long ItemId,            
        @QueryParam("plannedstartdate") @CalendarFormat("MM-dd-yyyy") Calendar plannedStartDate, 
        @QueryParam("plannedreturndate") @CalendarFormat("MM-dd-yyyy") Calendar plannedReturnDate)

就是这样。

答案 1 :(得分:-1)

无法使用java.util.Calendar作为@QueryParam的参数,因为它没有一个接受String的one-arg构造函数。你唯一的选择是引入一个新的类QueryCalendar,它将具有一个arg构造函数,并将返回Calendar(或继承它)。

有关谁可以成为论点的更多信息:http://docs.oracle.com/javaee/6/api/javax/ws/rs/QueryParam.html