如何解决REST Resource参数上的@XmlJavaTypeAdapter
请考虑以下域模型类的简化结构:
@XmlRootElement(name = "Foo",namespace = Namespaces.MAPPED_TO_DEFAULT)
@XmlJavaTypeAdapter(FooAdapter.class)
public abstract class Foo { }
public class XmlFoo extends Foo {
@XmlAnyElement(lax = true)
private Object any;
// getter and setter,XmlAccessType.FIELD
}
public class CustomFoo extends Foo {
private String elementName;
private String namespace;
private Map<String,String> data;
// getters,setters,XmlAcessType.FIELD,...
}
// and another Foo implementation
这些Foo
元素通过JAXB使用自定义FooAdapter
进行序列化,该自定义public class FooAdapter extends XmlAdapter<FooAdapter.Union,Foo> {
private final NamespacePrefixMapper prefixMapper;
public FooAdapter() {
prefixMapper = null;
}
public FooAdapter(NamespacePrefixMapper mapper) {
this.prefixMapper = mapper;
}
@Override
public Foo unmarshal(Union xml) {
// ...
}
@Override
public Union marshal(Foo data) {
// ...
}
@XmlRootElement(name = "Foo",namespace = Namespaes.MAPPED_TO_DEFAULT)
public static class Union {
@XmlAnyElement(lax = true)
private Object any;
// getter,setter,XmlAccessType.FIELD
}
}
通过检查/创建原始XML元素来解决多态性。为此,它将Foo类型重新映射为“联盟”,定义如下:
@XmlJavaTypeAdapter
出于序列化的目的,这可以按预期进行,并在尊重注入的NamespacePrefixMapper的同时将不同的Foo实现重新映射为单个原始XML元素。
不幸的是,反序列化远没有那么明显。
我有一个REST API资源,该资源允许对XML片段进行PUTing更新在父资源中解析的域模型元素的Foo。
我期望能够为将PUTed数据反序列化为Foo类型指定一个@PUT @Consumes({ MediaType.APPLICATION_XML,MediaType.TEXT_XML })
public Response setFoo(@XmlJavaTypeAdapter(FooAdapter.class) Foo foo)
,但是以下方法签名会导致该资源的类型不匹配:
Unmarshaller
据我所知,即使当我注入ContextResolver<Unmarshaller>
我已验证通过以下方式了解适配器行为时,JAX-RS设置也不尊重TypeAdapter对类型的重写: Union
。
结果是调用异常,因为反序列化的Xml数据的类型与方法参数的类型不同。反序列化转到Foo
,而不是@PUT @Consumes({ MediaType.APPLICATION_XML,MediaType.TEXT_XML })
public Response setFoo(Union xml) {
Foo foo = new FooAdapter().unmarshal(xml);
// original code here
}
。
通过使用以下方法在方法本身中手动重新映射,我已经能够记录这种行为:
Foo
但是我觉得这很不对劲。我不希望REST资源知道序列化实现的详细信息。
请注意,出于向后兼容的原因,我在编组期间不写任何类型信息,并且在编组期间也不依赖XML中的类型信息。 因此,PUT数据上没有xsi:type。
如何获取带有Infrastructure: Google Cloud Platform
Kubectl version:
Client Version: v1.18.6
Server Version: v1.16.13-gke.1.
helm chart:
helm repo add ibm-charts https://raw.githubusercontent.com/IBM/charts/master/repo/stable/
参数的有效REST方法?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。