有没有办法将 Class 作为参数传递给 JAXB XMLAdapter 或从另一个 class 访问 Getter 方法
Is there a way to pass Class as a Parameter to the JAXB XMLAdapter or access Getter method from another class
我正在尝试为我的一个对象创建一个 XMLAdapter
class。我需要从另一个 class 访问 Getters
,以便可以从 class 的 Getters` 填充一些对象,但我无法这样做。
基本上,我想在 XMLAdapter
中访问我的 Child
class Getter
方法。我可以创建 Child
class 的对象并访问,但结果是 NULL
。最初,我在 Child
和 Parent
class 中填充 Objects
。我想在 XML Adapter
中访问相同的值,所以我想知道是否有办法将 class 的引用传递给我的 XMLAdapter
.
我有以下 Parent
class 值:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlTransient
@XmlSeeAlso({Child.class})
public class Parent{
private String eventID;
}
以下是我的 Child
class,它将在编组期间用于创建 XML
:
@XmlRootElement(name = "child")
@XmlType(name = "child", propOrder = { "name","extension"})
public class Child extends Parent
{
@XmlElement (name = "name")
private String name;
@JsonIgnore
@XmlJavaTypeAdapter (ExtensionAdapter.class)
@XmlElement (name = "extension")
private Extension extension;
}
以下是我的分机 class:
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Extension {
private String eventID;
}
以下是我的XMLAdapter
class:
public class ExtensionAdapter extends XmlAdapter<Child, Extension> {
@Override
public Extension unmarshal(Child valueType) throws Exception {
System.out.println("UN-MARSHALLING");
return null;
}
@Override
public Child marshal(Extension boundType) throws Exception {
System.out.println("MARSHALLING");
System.out.println(boundType);
//If I create the New child type then I am unable to access the eventID from its getter as Child class is nulll
Child be = new Child();
be.setEventID(boundType.getEventID());
return be;
}
}
基本上,我想访问 XMLAdapter
中的 Child
glass Getter
方法,以便我可以填充我的 Extension
class EventID
与那个。我尝试了很多东西,但没有任何效果,所以我在这里发帖。
有什么方法可以将我的 Child
class 作为参数传递给 XMLAdapter
,以便我可以从中访问 Getter
方法?因为如果我创建一个 Child
class 的新对象,那么它的所有 Getter
方法都是空的。然而,一开始我填充了 Parent
和 Child
class 中的所有字段(名称和 eventID)。我只想使用 XMLAdapter
.
在 Extension
class eventID
中填充相同的值
我希望我能够解释需求。如果您有任何建议或示例代码,那将非常有用。
请注意:我在这里使用了非常示例代码。我知道无论我想实现什么,都可以使用适当的 POJO 和 JAXB 注释来实现,但我的实际 class 很复杂,我不允许修改它。我只能添加新的注释。因此,我正在尝试使用 XMLAdapter
.
来实现这一点
我想实现这样的目标,所以我无需访问 class 就可以做到。发布答案以便将来对某人有用。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.lang3.NotImplementedException;
import io.openepcis.model.jaxb.MyAdapter.MapWrapper;
public class MyAdapter extends XmlAdapter<MapWrapper, Map<String, Object>> {
private DocumentBuilder documentBuilder;
public MyAdapter() throws Exception {
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
}
@Override
public Map<String, Object> unmarshal(MapWrapper valurType) throws Exception {
throw new NotImplementedException();
}
@SuppressWarnings("unchecked")
@Override
public MapWrapper marshal(Map<String, Object> m) throws Exception {
if (m == null) {
return null;
}
MapWrapper wrapper = new MapWrapper();
List elements = new ArrayList();
for (Map.Entry<String, Object> property : m.entrySet()) {
if (property.getValue() instanceof Map) {
elements.add(new JAXBElement<MapWrapper>(new QName(getCleanLabel(property.getKey())), MapWrapper.class, marshal((Map) property
.getValue())));
} else {
elements.add(new JAXBElement<String>(new QName(getCleanLabel(property.getKey())), String.class, property.getValue().toString()));
}
}
wrapper.elements = elements;
return wrapper;
}
// Return a XML-safe attribute. Might want to add camel case support
private String getCleanLabel(String attributeLabel) {
attributeLabel = attributeLabel.replaceAll("[()]", "").replaceAll("[^\w\s]", "_").replaceAll(" ", "_");
return attributeLabel;
}
public static class MapWrapper {
@XmlAnyElement
List elements;
}
我正在尝试为我的一个对象创建一个 XMLAdapter
class。我需要从另一个 class 访问 Getters
,以便可以从 class 的 Getters` 填充一些对象,但我无法这样做。
基本上,我想在 XMLAdapter
中访问我的 Child
class Getter
方法。我可以创建 Child
class 的对象并访问,但结果是 NULL
。最初,我在 Child
和 Parent
class 中填充 Objects
。我想在 XML Adapter
中访问相同的值,所以我想知道是否有办法将 class 的引用传递给我的 XMLAdapter
.
我有以下 Parent
class 值:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlTransient
@XmlSeeAlso({Child.class})
public class Parent{
private String eventID;
}
以下是我的 Child
class,它将在编组期间用于创建 XML
:
@XmlRootElement(name = "child")
@XmlType(name = "child", propOrder = { "name","extension"})
public class Child extends Parent
{
@XmlElement (name = "name")
private String name;
@JsonIgnore
@XmlJavaTypeAdapter (ExtensionAdapter.class)
@XmlElement (name = "extension")
private Extension extension;
}
以下是我的分机 class:
@NoArgsConstructor
@AllArgsConstructor
@XmlAccessorType(XmlAccessType.FIELD)
public class Extension {
private String eventID;
}
以下是我的XMLAdapter
class:
public class ExtensionAdapter extends XmlAdapter<Child, Extension> {
@Override
public Extension unmarshal(Child valueType) throws Exception {
System.out.println("UN-MARSHALLING");
return null;
}
@Override
public Child marshal(Extension boundType) throws Exception {
System.out.println("MARSHALLING");
System.out.println(boundType);
//If I create the New child type then I am unable to access the eventID from its getter as Child class is nulll
Child be = new Child();
be.setEventID(boundType.getEventID());
return be;
}
}
基本上,我想访问 XMLAdapter
中的 Child
glass Getter
方法,以便我可以填充我的 Extension
class EventID
与那个。我尝试了很多东西,但没有任何效果,所以我在这里发帖。
有什么方法可以将我的 Child
class 作为参数传递给 XMLAdapter
,以便我可以从中访问 Getter
方法?因为如果我创建一个 Child
class 的新对象,那么它的所有 Getter
方法都是空的。然而,一开始我填充了 Parent
和 Child
class 中的所有字段(名称和 eventID)。我只想使用 XMLAdapter
.
Extension
class eventID
中填充相同的值
我希望我能够解释需求。如果您有任何建议或示例代码,那将非常有用。
请注意:我在这里使用了非常示例代码。我知道无论我想实现什么,都可以使用适当的 POJO 和 JAXB 注释来实现,但我的实际 class 很复杂,我不允许修改它。我只能添加新的注释。因此,我正在尝试使用 XMLAdapter
.
我想实现这样的目标,所以我无需访问 class 就可以做到。发布答案以便将来对某人有用。
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.lang3.NotImplementedException;
import io.openepcis.model.jaxb.MyAdapter.MapWrapper;
public class MyAdapter extends XmlAdapter<MapWrapper, Map<String, Object>> {
private DocumentBuilder documentBuilder;
public MyAdapter() throws Exception {
documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
}
@Override
public Map<String, Object> unmarshal(MapWrapper valurType) throws Exception {
throw new NotImplementedException();
}
@SuppressWarnings("unchecked")
@Override
public MapWrapper marshal(Map<String, Object> m) throws Exception {
if (m == null) {
return null;
}
MapWrapper wrapper = new MapWrapper();
List elements = new ArrayList();
for (Map.Entry<String, Object> property : m.entrySet()) {
if (property.getValue() instanceof Map) {
elements.add(new JAXBElement<MapWrapper>(new QName(getCleanLabel(property.getKey())), MapWrapper.class, marshal((Map) property
.getValue())));
} else {
elements.add(new JAXBElement<String>(new QName(getCleanLabel(property.getKey())), String.class, property.getValue().toString()));
}
}
wrapper.elements = elements;
return wrapper;
}
// Return a XML-safe attribute. Might want to add camel case support
private String getCleanLabel(String attributeLabel) {
attributeLabel = attributeLabel.replaceAll("[()]", "").replaceAll("[^\w\s]", "_").replaceAll(" ", "_");
return attributeLabel;
}
public static class MapWrapper {
@XmlAnyElement
List elements;
}