当前位置: 首页 > 面试题库 >

CXF JAXRS-如何将日期作为QueryParam传递

拓拔迪
2023-03-14
问题内容

我的服务定义如下。

public String getData(@QueryParam("date") Date date)

我正在尝试java.util.Date从客户端(它是CXF的jaxrs:client,而不是通用HTTP客户端或浏览器)传递给它。

我的服务接收的日期Thu Mar 01 22:33:10 IST 2012与HTTP URL中的一样。由于CXF无法Date使用此String
创建对象,因此我的客户端收到404错误。我曾尝试ParameterHandler在服务端使用a
,但由于无法预期任何特定格式的日期,因此仍然无法成功解析它。

根据这篇文章,传递a
Date应该是开箱即用的,但是我似乎无法使基本案例起作用。为了成功将Date对象从客户端传递到服务,我需要做任何事情吗?感谢任何帮助。

谢谢


问题答案:

问题在于,JAX-RS指示以两种方式之一进行参数解绑:

  1. 参数bean有一个接受字符串的公共构造函数
  2. 参数bean具有静态valueOf(String)方法。

在您的情况下,Date通过其Date(String)构造函数进行了捆绑,该构造函数无法处理客户端发送的输入格式。您可以通过几种方法来解决此问题:

选项1

让您的客户在发送日期之前更改日期的格式。这是理想的,但可能是最难实现的!

选项2

处理疯狂的日期格式。选项包括:

更改您的方法签名以接受字符串。 尝试从中构造Date对象,如果失败,请使用您自己的自定义SimpleDateFormat类进行解析。

static final DateFormat CRAZY_FORMAT = new SimpleDateFormat("");

public String getData(@QueryParam("date") String dateString) {
    final Date date;
    try {
        date = new Date(dateString); // yes, I know this is a deprecated method
    } catch(Exception e) {
        date = CRAZY_FORMAT.parse(dateString);
    }
}

定义您自己的执行上述逻辑的参数类。
给它一个字符串构造器或valueOf(String)调用逻辑的静态方法。说完所有方法后,还有一种获取日期的附加方法。

public class DateParameter implements Serializable {
    public static DateParameter valueOf(String dateString) {
        try {
            date = new Date(dateString); // yes, I know this is a deprecated method
        } catch(Exception e) {
            date = CRAZY_FORMAT.parse(dateString);
        }
    }

    private Date date;
    // Constructor, Getters, Setters
}

public String getData(@QueryParam("date") DateParameter dateParam) {
    final Date date = dateParam.getDate();
}

或者最后,您可以为日期注册参数处理程序。 其逻辑与上面其他选项所提到的完全相同。请注意,您需要至少使用CXF
2.5.3才能评估参数处理程序,然后再尝试使用默认的捆绑逻辑。

public class DateHandler implements ParameterHandler<Date> {
    public Map fromString(String s) {
        final Date date;
        try {
            date = new Date(dateString); // yes, I know this is a deprecated method
        } catch(Exception e) {
            date = CRAZY_FORMAT.parse(dateString);
        }
    }
}


 类似资料:
  • 我有一个REST服务,它接收许多查询参数,其中包括字符串列表。我使用RestAssured来测试这个REST服务,但是我在将列表传递给服务时遇到了一些问题。 我的Rest服务:

  • 问题内容: 我正在尝试创建以start_date和end_date为参数的 JR 报告。 查询: 代码: 我们可以将两个参数传递到表中的同一列吗?例如: 问题答案: 您的代码是错误的。 您应该传递如下参数: 您无需添加 到参数名称。 JasperReports 分发包中有很多示例。 您可以查看此样本以获取更多详细信息。

  • 问题内容: 我需要转换为搜索的内容,但找不到任何内容。那你可以帮我解决这个问题吗? 编辑: 我在GWT屏幕上执行此转换过程。我在屏幕上,使用它的方法可以给我带来价值。因此,我应该将此值放入具有Date类型的对象的属性中。 希望我的编辑会更加清晰。 编辑2: 这行是我的问题的解决方案: 问题答案: 日期转换的最佳方法是使用以毫秒为单位的时间(UTC)。JS Date对象和java.util.Date

  • 我想用C#将一个自定义的公历日期转换为波斯日期。例如,我有一个包含以下内容的字符串: 现在我想拥有: 串PersianDate=2 1392; 或 字符串PersianDate=1392/08/02 谢谢

  • 我知道这个问题被问了很多次,但我没有找到正确的方法。我有一个日期,比如01-08-1994。我想把它转换成日期。使用。

  • 周日->明谷-0 周一->赛宁-1 周二->Selasa-2 帮我谢谢