JAXB无法封送类型";java.lang.Class”的;
我想写一个XML文件,我有一个包含映射对象的实体类。 我添加了注释,现在我在JSF页面中有一个按钮,可以生成XML文件,但是在输出文件中,我只找到了主类,没有找到另一个映射类,我在注释中添加了一个。 这是我的主要课程: 包esprit.olap.domainJAXB无法封送类型";java.lang.Class”的;,java,xml,jaxb,jaxb2,Java,Xml,Jaxb,Jaxb2,我想写一个XML文件,我有一个包含映射对象的实体类。 我添加了注释,现在我在JSF页面中有一个按钮,可以生成XML文件,但是在输出文件中,我只找到了主类,没有找到另一个映射类,我在注释中添加了一个。 这是我的主要课程: 包esprit.olap.domain @XmlRootElement(name="Schema") @XmlType(propOrder = { "parameters", "cubes", "dimensions", "catalogBase" }) @Entity publ
@XmlRootElement(name="Schema")
@XmlType(propOrder = { "parameters", "cubes", "dimensions", "catalogBase" })
@Entity
public class SchemaBase implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id_schema;
private String name_schema;
private String description_schema;
private String measuresCaption_schema;
private String defaultRole_schema;
@ManyToOne(fetch=FetchType.LAZY)
private CatalogBase catalogBase;
@OneToMany (cascade={CascadeType.MERGE,CascadeType.ALL})
private List<CubeBase>cubes ;
@OneToMany (cascade={CascadeType.MERGE,CascadeType.ALL})
private List<ParameterBase>parameters;
@ManyToMany
private List<DimensionBase> dimensions;
public List<ParameterBase> getParameters() {
return parameters;
}
@XmlElement(name="Parameter")
public void setParameters(List<ParameterBase> parameters) {
this.parameters = parameters;
}
public List<DimensionBase> getDimensions() {
return dimensions;
}
@XmlElement(name="Dimension")
public void setDimensions(List<DimensionBase> dimensions) {
this.dimensions = dimensions;
}
public List<CubeBase> getCubes() {
return cubes;
}
@XmlElement(name="Cube")
public void setCubes(List<CubeBase> cubes) {
this.cubes = cubes;
}
public CatalogBase getCatalogBase() {
return catalogBase;
}
public void setCatalogBase(CatalogBase catalogBase) {
this.catalogBase = catalogBase;
}
public int getId_schema() {
return id_schema;
}
@XmlTransient
public void setId_schema(int id_schema) {
this.id_schema = id_schema;
}
public String getName_schema() {
return name_schema;
}
@XmlAttribute(name="name")
public void setName_schema(String name_schema) {
this.name_schema = name_schema;
}
public String getDescription_schema() {
return description_schema;
}
@XmlAttribute(name="description")
public void setDescription_schema(String description_schema) {
this.description_schema = description_schema;
}
public String getMeasuresCaption_schema() {
return measuresCaption_schema;
}
@XmlTransient
public void setMeasuresCaption_schema(String measuresCaption_schema) {
this.measuresCaption_schema = measuresCaption_schema;
}
public String getDefaultRole_schema() {
return defaultRole_schema;
}
@XmlAttribute(name="defaultValue")
public void setDefaultRole_schema(String defaultRole_schema) {
this.defaultRole_schema = defaultRole_schema;
}
public void addCubeToShema(List<CubeBase> cubes){
for(CubeBase cubeBase:cubes)
cubeBase.setSchema(this);
this.cubes=cubes;
}
public void addParameterToSchema(List<ParameterBase> parameters){
for(ParameterBase param:parameters)
param.setSchema(this);
this.parameters=parameters;
}
public SchemaBase(String name_schema, String description_schema,
String measuresCaption_schema, String defaultRole_schema,
List<CubeBase> cubes, List<ParameterBase> parameters,
List<DimensionBase> dimensions) {
super();
this.name_schema = name_schema;
this.description_schema = description_schema;
this.measuresCaption_schema = measuresCaption_schema;
this.defaultRole_schema = defaultRole_schema;
this.cubes = cubes;
this.parameters = parameters;
this.dimensions = dimensions;
}
public SchemaBase(String name_schema,List<CubeBase> cubes, List<ParameterBase> parameters,
List<DimensionBase> dimensions) {
super();
this.name_schema = name_schema;
this.cubes = cubes;
this.parameters = parameters;
this.dimensions = dimensions;
}
public SchemaBase(String name_schema) {
super();
this.name_schema = name_schema;
}
public SchemaBase() {
super();
}
}
以及为SchemaBase服务:
public interface SchemaDaoRemote {
public SchemaBase create_schema (SchemaBase schema);
public void update_schema (SchemaBase schema);
public void delete_schema(int id);
public List<SchemaBase>list_schema(int id);
public SchemaBase find_schema(int id);
}
公共接口模式远程{
公共SchemaBase create_schema(SchemaBase schema);
公共void更新_模式(SchemaBase模式);
公共void delete_模式(int-id);
公共列表_模式(int-id);
公共SchemaBase find_schema(int-id);
}
我在另一个托管bean上创建如下内容:
@ManagedBean(name = "xmlMan")
@SessionScoped
public class XmlGenaratedManaged {
@ManagedProperty(value = "#{SchemaMan}")
SchemaManaged shmanged;
@ManagedProperty(value = "#{paraMan}")
ParameterManaged param;
public SchemaManaged getShmanged() {
return shmanged;
}
public void setShmanged(SchemaManaged shmanged) {
this.shmanged = shmanged;
}
public ParameterManaged getParam() {
return param;
}
public void setParam(ParameterManaged param) {
this.param = param;
}
public void GenerateXml(){
//SchemaBase schema = new SchemaBase();
shmanged.schema.setParameters(new ArrayList<ParameterBase>());
//ParameterBase pb=param.getParamUpdate();
//schema.getParameters().add(pb);
shmanged.schema.getParameters().add(param.getParamUpdate());
JAXBContext jaxbContext;
try {
jaxbContext = JAXBContext.newInstance(SchemaBase.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
System.out.println("This is your cube"+shmanged.getSchema().getParameters());
//specify the location and name of xml file to be created
File XMLfile = new File("C:\\EspritJSF.xml");
// for getting nice formatted output
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
// Writing to XML file
jaxbMarshaller.marshal(shmanged.getSchema(), XMLfile);
// Writing to console
jaxbMarshaller.marshal(shmanged.getSchema(), System.out);
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@ManagedBean(name=“xmlMan”)
@会议范围
公共类xmlganaratedmanaged{
@ManagedProperty(value=“#{SchemaMan}”)
计划管理;
@ManagedProperty(value=“#{paraMan}”)
参数管理参数;
公共模式命名的getShmanged(){
返回shmanged;
}
公共无效设置为空(SchemaManaged为空){
this.shmanged=shmanged;
}
公共参数管理的getParam(){
返回参数;
}
public void setParam(参数管理参数){
this.param=param;
}
public void GenerateXml(){
//SchemaBase schema=新SchemaBase();
setParameters(新的ArrayList());
//ParameterBase pb=param.getParamUpdate();
//schema.getParameters().add(pb);
shmanged.schema.getParameters().add(param.getParamUpdate());
JAXBContext JAXBContext;
试一试{
jaxbContext=jaxbContext.newInstance(SchemaBase.class);
Marshaller jaxbMarshaller=jaxbContext.createMarshaller();
System.out.println(“这是您的多维数据集”+shmanged.getSchema().getParameters());
//指定要创建的xml文件的位置和名称
File XMLfile=新文件(“C:\\EspritJSF.xml”);
//用于获得良好的格式化输出
setProperty(Marshaller.JAXB_格式化的_输出,Boolean.TRUE);
//写入XML文件
jaxbMarshaller.marshall(shmanged.getSchema(),XMLfile);
//写入控制台
jaxbMarshaller.marshall(shmanged.getSchema(),System.out);
}捕获(JAXBEException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
但当我添加示例2 parametrbase并运行它时,我只得到XML文件中的最后一个参数,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Schema defaultValue="" description="fdsd" name="fdg">
<Parameter defaultValue="dffdfd" description="fdsf" modifiable="false" name="dfd" type="Timestamp"/>
</Schema>
因此,如何在XML文件中设置两个参数,以及thx all以获得您的帮助。您的类和所有内容都设置正确,但根据您看到的情况,您的模式对象没有正确填充。 我构造了一组类来模拟您在这里描述的内容,其中包含一些任意内容,并且能够很好地封送 类型:
@XmlRootElement(name = "Parameter")
@XmlAccessorType(XmlAccessType.FIELD)
public class ParameterBase {
@XmlElement(name = "Name")
public String paramName;
@XmlElement(name = "Value")
public String paramValue;
public ParameterBase() {}
public void setParamName(String paramName) { this.paramName = paramName; }
public void setParamValue(String paramValue) { this.paramValue = paramValue; }
public String getParamName() { return this.paramName; }
public String getParamValue() { return this.paramValue; }
}
@XmlRootElement(name = "Cube")
@XmlAccessorType(XmlAccessType.FIELD)
public class CubeBase {
@XmlElement(name = "X")
int x;
@XmlElement(name = "Y")
int y;
@XmlElement(name = "Z")
int z;
public CubeBase() {
x = 0;
y = 0;
z = 0;
}
public int getX() {
return this.x;
}
public int getY() {
return this.y;
}
public int getZ() {
return this.z;
}
public void setX(int x) { this.x = x; }
public void setY(int y) { this.y = y; }
public void setZ(int z) { this.z = z; }
}
@XmlRootElement(name = "Dimension")
@XmlAccessorType(XmlAccessType.FIELD)
public class DimensionBase {
@XmlElement(name = "Value")
int dim;
public DimensionBase() {
dim = 0;
}
public void setDim(int dim) { this.dim = dim; }
public int getDim() { return this.dim; }
}
@XmlRootElement(name = "Catalog")
@XmlAccessorType(XmlAccessType.FIELD)
public class CatalogBase {
@XmlElement(name = "Name")
String catalogName;
public CatalogBase() {
}
public void setCatalogName(String name) {
this.catalogName = name;
}
public String getCatalogName() {
return this.catalogName;
}
}
架构类型:
@XmlRootElement(name="Schema")
@XmlType(propOrder = { "parameters", "cubes", "dimensions", "catalogBase" })
@XmlAccessorType(XmlAccessType.FIELD)
public class SchemaBase {
@XmlElement(name = "Parameter")
List<ParameterBase> parameters;
@XmlElement(name = "Cube")
List<CubeBase> cubes;
@XmlElement(name = "Dimension")
List<DimensionBase> dimensions;
@XmlElement(name = "CatalogBase")
CatalogBase catalogBase;
@XmlAttribute(name = "defaultValue")
String defaultValue;
@XmlAttribute(name = "description")
String description;
@XmlAttribute(name = "name")
String name;
public SchemaBase() {
defaultValue = "dsf";
description = "sdfsd";
name = "dsq";
}
public SchemaBase(String defaultValue, String description, String name) {
this.defaultValue = defaultValue;
this.description = description;
this.name = name;
}
public List<ParameterBase> getParameters() { return this.parameters; }
public List<CubeBase> getCubes() { return this.cubes; }
public List<DimensionBase> getDimensions() { return this.dimensions; }
public CatalogBase getCatalogBase() { return this.catalogBase; }
public void setParameters(List<ParameterBase> parameters ) { this.parameters = parameters;}
public void setCubes(List<CubeBase> cubes ) { this.cubes = cubes;}
public void setDimensions(List<DimensionBase> dimensions ) { this.dimensions = dimensions;}
public void setCatalogBase(CatalogBase catalogBase) { this.catalogBase = catalogBase; }
}
检查schema对象并确保其已完全填充。您需要使用schema.class而不是schema.class。您的schema对象在哪里表示您正在jaxbMarshaller.marshall(schema,System.out)中使用?尝试使用JAXBContext JAXBContext=JAXBContext.newInstance(“package.of.your.schema.class”);映射类是否已填充?如果它们为null或空,我认为当您尝试封送时,您不会得到类对象的任何内容。该类型工作正常,因为在封送处理时获得了正确的标记,丢失的只是数据。我们可以看到填充了
schema
对象的代码吗?是的,我的SchemaBase是这样的:publicschemabase schema=newschemabase();在我的Schema Managed Beai中,我做了一个测试,就像你每次测试CubeBase和其他对象时做的那样,当我通过SchemaBase.Class时,它工作得很好,但在我的JSF页面中,当我将CubeBase添加到数据库中的主对象SchemaBase中时,我可以看到它与同一个SchemaBase关联的CubeBase,但当我运行代码时,它只会向我展示SchemaBase的xml。您必须粘贴用于设置对象的代码。我在下面遇到了问题。您现在可以看到所有代码了,谢谢您的帮助,当我编写此代码时:System.out.println(“参数返回”+schema.getParameters());我得到null,但当我进入数据库时,我看到这个参数与这个模式关联!!!!
@XmlRootElement(name="Schema")
@XmlType(propOrder = { "parameters", "cubes", "dimensions", "catalogBase" })
@XmlAccessorType(XmlAccessType.FIELD)
public class SchemaBase {
@XmlElement(name = "Parameter")
List<ParameterBase> parameters;
@XmlElement(name = "Cube")
List<CubeBase> cubes;
@XmlElement(name = "Dimension")
List<DimensionBase> dimensions;
@XmlElement(name = "CatalogBase")
CatalogBase catalogBase;
@XmlAttribute(name = "defaultValue")
String defaultValue;
@XmlAttribute(name = "description")
String description;
@XmlAttribute(name = "name")
String name;
public SchemaBase() {
defaultValue = "dsf";
description = "sdfsd";
name = "dsq";
}
public SchemaBase(String defaultValue, String description, String name) {
this.defaultValue = defaultValue;
this.description = description;
this.name = name;
}
public List<ParameterBase> getParameters() { return this.parameters; }
public List<CubeBase> getCubes() { return this.cubes; }
public List<DimensionBase> getDimensions() { return this.dimensions; }
public CatalogBase getCatalogBase() { return this.catalogBase; }
public void setParameters(List<ParameterBase> parameters ) { this.parameters = parameters;}
public void setCubes(List<CubeBase> cubes ) { this.cubes = cubes;}
public void setDimensions(List<DimensionBase> dimensions ) { this.dimensions = dimensions;}
public void setCatalogBase(CatalogBase catalogBase) { this.catalogBase = catalogBase; }
}
public class Test {
public static void main(String[] args) throws Exception {
SchemaBase schema = new SchemaBase("Default", "MySchema", "MySchemaName");
CatalogBase cb = new CatalogBase();
cb.setCatalogName("My Catalog");
schema.setCatalogBase(cb);
schema.setDimensions(new ArrayList<DimensionBase>());
DimensionBase db = new DimensionBase();
db.setDim(12);
schema.getDimensions().add(db);
db = new DimensionBase();
db.setDim(14);
schema.getDimensions().add(db);
db = new DimensionBase();
db.setDim(50);
schema.getDimensions().add(db);
schema.setCubes(new ArrayList<CubeBase>());
CubeBase cube = new CubeBase();
cube.setX(3);
cube.setY(13);
cube.setZ(20);
schema.getCubes().add(cube);
schema.setParameters(new ArrayList<ParameterBase>());
ParameterBase pb = new ParameterBase();
pb.setParamName("MyParamName");
pb.setParamValue("MyParamValue");
schema.getParameters().add(pb);
JAXBContext context = JAXBContext.newInstance(new Class[]{schema.getClass()});
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(schema, System.out);
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Schema defaultValue="Default" description="MySchema" name="MySchemaName">
<Parameter>
<Name>MyParamName</Name>
<Value>MyParamValue</Value>
</Parameter>
<Cube>
<X>3</X>
<Y>13</Y>
<Z>20</Z>
</Cube>
<Dimension>
<Value>12</Value>
</Dimension>
<Dimension>
<Value>14</Value>
</Dimension>
<Dimension>
<Value>50</Value>
</Dimension>
<CatalogBase>
<Name>My Catalog</Name>
</CatalogBase>
</Schema>
public class Test {
public static void main(String[] args) throws Exception {
SchemaBase schema = new SchemaBase("Default", "MySchema", "MySchemaName");
JAXBContext context = JAXBContext.newInstance(new Class[]{schema.getClass()});
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(schema, System.out);
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Schema defaultValue="Default" description="MySchema" name="MySchemaName"/>