2

这是我正在尝试做的事情:

@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>

对该方法的调用失败,因为没有发生字符串到日历的转换。我不想传递字符串而不是日历,因为还有其他客户端直接进行 java 调用。谁能帮助我如何将日期传递给休息电话?

谢谢维尔

4

2 回答 2

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)

就是这样。

于 2012-12-05T23:41:24.420 回答
-1

不能java.util.Calendar用作 的参数@QueryParam,因为它没有接受的单参数构造函数String。您唯一的选择是引入一个新的 class QueryCalendar,它将具有单参数构造函数并将返回Calendar(或继承它)。

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

于 2012-12-05T14:50:57.250 回答