2014-08-06 2 views
2

XML 파일을 쓰고 싶습니다. 매핑 된 객체가 포함 된 엔티티 클래스가 있습니다. annotations.Now XML 파일을 생성하는 JSF 페이지에 단추가 있지만 출력 파일에서 주석이있는 다른 매핑 된 클래스가없는 기본 클래스 만 발견했습니다. 이것은 내 mainClass입니다.JAXB "java.lang.Class"형식을 마샬링 할 수 없습니다.

패키지 esprit.olap.domain;

@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 내 ManagedBean은 다음과 같습니다

@ManagedBean(name="SchemaMan") 
@SessionScoped 
public class SchemaManaged { 

    @EJB 
    SchemaDaoRemote schemaService; 

    //private SchemaBase schema; 
    public SchemaBase schema = new SchemaBase(); 
    private WriteXml xl= new WriteXml(); 

    private String roleSchema; 
    private String descSchema; 
    private String nameSchema; 
    private TreeNode shemaBoxses; 
    private TreeNode shemaBoxse; 


    @PostConstruct 
    public void init() { 

    shemaBoxses = new DefaultTreeNode("Schema", null); 
    TreeNode node0 = new DefaultTreeNode("Schema", shemaBoxses); 



} 

    public String getRoleSchema() { 
     return roleSchema; 
    } 
    public void setRoleSchema(String roleSchema) { 
     this.roleSchema = roleSchema; 
    } 
    public String getDescSchema() { 
     return descSchema; 
    } 
    public void setDescSchema(String descSchema) { 
     this.descSchema = descSchema; 
    } 


    public SchemaBase getSchema() { 
     return schema; 
    } 

    public void setSchema(SchemaBase schema) { 
     this.schema = schema; 
    } 

    public String getNameSchema() { 
     return nameSchema; 
    } 
    public void setNameSchema(String nameSchema) { 
     this.nameSchema = nameSchema; 
    } 
    public TreeNode getShemaBoxse() { 
     return shemaBoxse; 
    } 
    public void setShemaBoxse(TreeNode shemaBoxse) { 
     this.shemaBoxse = shemaBoxse; 
    } 
    public TreeNode getShemaBoxses() { 
     return shemaBoxses; 
    } 
    public void setShemaBoxses(TreeNode shemaBoxses) { 
     this.shemaBoxses = shemaBoxses; 
    } 

    public String CreateSchema(){ 
     System.out.println(schema.getName_schema()); 
     schema = schemaService.create_schema(schema); 

     FacesContext context= FacesContext.getCurrentInstance(); 
     context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Schema "+schema.getName_schema()+" ajouter avec succees", "")); 
     return "Scucces"; 


} 


} 

및 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); 


} 

난 onther과 같이 빈을 관리 만들 :

@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(); 
     } 
     } 

} 

하지만 내가 예를 들어 추가했을 때 전자 2 ParamterBase과 내가 그것을 내가 이렇게 내 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 파일을 들으 당신의 도움에 대한 모든 내 두 개의 매개 변수를 가질 수 있습니다.

+0

schema.class 대신 Schema.class가 필요합니다. – user3487063

+0

jaxbMarshaller.marshal (schema, System.out)에서 사용중인 스키마 객체가 어디에 있습니까? ? – user3487063

+0

JAXBContext를 사용해 봅니다. jaxbContext = JAXBContext.newInstance ("package.of.your.schema.class"); – Xstian

답변

0

클래스와 모든 것이 올바르게 설정되었지만 표시 내용에 따라 스키마 개체가 제대로 채워지지 않습니다. 여기에 설명 된 내용을 임의의 내용으로 모방 한 클래스 집합을 구성하여 잘 정리할 수있었습니다.

유형 :

@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; } 
} 

:

<?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> 
,617 :

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); 
    } 
} 

다음 출력을 생성 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"/> 

는 스키마 객체를 검사하고 완전히 채워 확신합니다.

+0

나는 당신이 CubeBase와 다른 객체를 사용할 때마다 인스턴스를 만들었고, SchemaBase.Class를 통과 시켰을 때 잘 동작하지만 JSF 페이지에서 cubeBase를 주 데이터베이스에 추가했다. CubeBase가 동일한 SchemaBase와 연결된다는 것을 알았지 만 코드를 실행하면 SchemaBase에 대한 XML 만 표시합니다. –

+1

개체를 설정하는 데 사용하는 코드를 붙여 넣어야합니다. 나는 다음과 같은 문제를 겪고있다. –

+0

당신은 지금 모든 코드를 볼 수 있습니다 당신의 도움을 주셔서 감사합니다 –

관련 문제