【发布时间】:2015-06-02 15:56:31
【问题描述】:
我正在使用 jersey 和 MOXy 为基于 JAXB 的 JSON 支持编写一个 RESTful Web 应用程序。
我的目标是使用 POJO 作为使用 JSON 的方法参数。
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void postRequest(MyPOJO myPOJO) {
System.out.println(myPOJO.name);
System.out.println(myPOJO.currency);
}
这个 POJO 有一个字符串成员和一个 java.util.Currency 类型的成员。
@XmlRootElement
public class MyPOJO {
public String name;
public Currency currency;
public MyPOJO() {};
}
我还有一个自定义 Currency ParamConverter(和 Provider),见下文。有了这个,我就可以正确处理 Currency 类型的 QueryParam。
但是,如果我使用以下 JSON 内容通过 POST 查询我的资源,则货币未映射,并且在正确映射名称时将为空。
{ "name": "peter", "currency": "EUR" }
控制台输出结果为:
peter
null
我还需要做什么来告诉 MOXy 正确映射这个嵌套对象成员?
这是我的货币参数转换器:
@Provider
public class CurrencyParamConverterProvider implements ParamConverterProvider {
@Override
public <T> ParamConverter<T> getConverter(final Class<T> rawType, Type genericType, Annotation[] annotations) {
return rawType != Currency.class ? null : new ParamConverter<T>() {
@Override
public T fromString(String value) {
if (value == null) {
throw new IllegalArgumentException(LocalizationMessages.METHOD_PARAMETER_CANNOT_BE_NULL("value"));
}
try {
return rawType.cast(Currency.getInstance(value));
} catch (IllegalArgumentException e) {
throw new ExtractorException("Currency must be a valid ISO 4217 code of the currency.", e);
}
}
@Override
public String toString(T value) {
if (value == null) {
throw new IllegalArgumentException(LocalizationMessages.METHOD_PARAMETER_CANNOT_BE_NULL("value"));
}
return value.toString();
}
};
}
}
【问题讨论】:
标签: java json jersey jax-rs moxy