【发布时间】:2015-08-05 08:25:31
【问题描述】:
我正在使用 Mule 3.5.2,并且我有一个发送和接收 JSON 消息的 REST 服务。该服务适用于挪威和瑞典。所有日期都以字符串形式发送,但瑞典和挪威的格式不同。我通过 URL 知道哪个国家/地区调用我们的服务。我正在使用自定义日期序列化器和反序列化器。
在接收 JSON 消息时我可以作弊,格式不同,在我的自定义反序列化器中我可以尝试一种格式。如果失败了,我就试试另一个。但是:如何以正确的格式进行序列化?
似乎没有任何方法可以向序列化程序发送参数,表明此特定消息将发送到挪威,因此请使用此日期格式...而下一个发送到瑞典则使用另一种格式等。
我拥有的代码,可能会有所帮助:
@GET
@Path("{country:se|no}/{id}")
public Response webservice(@PathParam("country") String country,
@PathParam("id") String id) {
country = country.toUpperCase();
WebServiceResponse response = doWebServiceStuff(id, country)
return Response.ok(reponse).build();
}
Response 有一个 .language() 方法,但这似乎只会影响标头。
@JsonAutoDetect
public class WebServiceResponse {
@JsonSerialize(using = JsonDateSerializer.class)
@JsonDeserialize(using = JsonDateDeserializer.class)
private Date date;
public void setDate(Date d) { this.date = d; }
public Date getDate() { return this.date; }
}
今天的序列化器。我希望它能够适应挪威用户或瑞典用户。
public class JsonDateSerializer extends JsonSerializer<Date> {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {
String formattedDate = dateFormat.format(date);
gen.writeString(formattedDate);
provider.getConfig().getDateFormat()
}
}
反序列化器。它也有同样的问题,但我可以用 try/catch 包围它...如果瑞典日期格式无效,请尝试使用挪威数字进行解析,如果仍然有问题则抛出 RuntimeException。
public class JsonDateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser parser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
String dateText = parser.getText();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return dateFormat.parse(dateText);
} catch (ParseException e) {
// TODO Auto-generated catch block
throw new RuntimeException("Can't parse date " + dateText, e);
}
}
}
顺便说一句...我正在使用 Jackson 的 codehaus 版本,因为它似乎适用于 Mule。我尝试了 FasterXML 版本,但没有使用我的自定义序列化程序,也没有使用新的基于注释的格式化程序(所以你不需要自定义序列化程序)。确切地说是 1.9.11 版。
再次重申:问题是,我如何根据每条消息的 URL(更准确地说是外部)等条件控制日期格式。我在 webservice-method(第一个代码块)中知道我正在与哪个国家/地区交谈,但在序列化程序中不知道...
结果
我在下面提供的解决方案确实可以解决我的问题,但我相信它无法在 Mule 3.5.2 EE 中运行。但是,如果使用 Mule 3.6.0 或 3.7.0(现在似乎是最新版本),这可能是您以及可能使用其他框架的其他人的解决方案。
cmets 中没有提到,但我确实尝试注释掉“String country = uriInfo.getPathParameters().getFirst("country");”并将国家硬编码为“否”,我确实得到了挪威日期格式。当用“se”重新编译它时,我确实得到了瑞典语格式,所以即使我无法让它工作,这个解决方案也确实有效。
更新2
我确实与 Mule Support 进行了讨论。在 Mule 和更早版本的 3.5.x 中,发布了 jersey-json 和 jackson-jaxrs,它加载的有点随机(并且取决于不同的环境)。可以从 $MULE_HOME/lib/opt 中删除 jersey-json。 3.6.x 及更高版本将仅发布 jackson-jaxrs。
当我坐在一个有许多工作流的系统上时,我没有时间测试删除 jersey-json 是否不会破坏任何东西(因为删除文件会影响所有流,而不仅仅是这个)。基本上 3.6.x 及更高版本将对 Jersey 有更好的控制(选择提供者等),并且可以使其正常工作。
【问题讨论】: