2015-11-01 2 views
2

Мне нужен мой сервер для разворачивания xml-файлов. Я реализовал класс для этого на своем собственном компьютере под управлением Java 1.8, и он отлично работает. Однако, когда я запускаю тот же самый код на сервере, который запускает Java 1.7, объект создается, но я получаю нулевое значение для элемента «domain».JAXB unmarshalling работает на Java 1.8, но возвращает нулевые значения в Java 1.7

Мой код может быть не идеальной практикой при использовании JAXB, но, как я уже говорил по java 1.8, он делает именно то, что мне нужно. Кто-нибудь имеет представление о причине такого поведения? Любая помощь будет принята с благодарностью.

Это XML-файл, пример, который я пытаюсь распаковать:

<planning:metadata xmlns:planning="http://planning.com"> 
    <domain id=numeric"> 
    <title xml:lang="en">The numeric formulation</title> 
    <files_last_modified>2002-06-01T12:00:00</files_last_modified> 
    <metadata_last_modified>2014-04-02T11:31:17.471631</metadata_last_modified> 
    <published>2002-06-01T12:00:00</published> 
    <link>http://ipc.icaps.org/</link> 
    <requirements> 
     <typing/> 
     <fluents/> 
    </requirements> 
    <problems> 
     <problem domain_file="domain.pddl" number="1" problem_file="p01.pddl"/> 
     <problem domain_file="domain.pddl" number="2" problem_file="p02.pddl"/> 
     <problem domain_file="domain.pddl" number="3" problem_file="p03.pddl"/> 
     <problem domain_file="domain.pddl" number="4" problem_file="p04.pddl"/> 
     <problem domain_file="domain.pddl" number="5" problem_file="p05.pddl"/> 
     <problem domain_file="domain.pddl" number="6" problem_file="p06.pddl"/> 
    </problems> 
    </domain> 
</planning:metadata> 

Это файл Java:

package server; 

import javax.xml.bind.annotation.*; 
import java.util.ArrayList; 
import java.util.Date; 

@XmlRootElement(name="metadata") 
public class XmlDomain { 

private XmlDomain.Domain domain; 

public XmlDomain.Domain getDomain() { 
    return domain; 
} 

@XmlElement 
public void setDomain(XmlDomain.Domain domain) { 
    this.domain = domain; 
} 

public static class Domain { 
    private String id; 
    private String title; 
    private Date filesModifiedDate; 
    private Date metaModifiedDate; 
    private Date publishedDate; 
    private String link; 
    private Requirements requirements; 
    private Problems problems; 

    public String getId() { 
     return id; 
    } 

    @XmlAttribute 
    public void setId(String id) { 
     this.id = id; 
    } 

    public String getTitle() { 
     return title; 
    } 

    @XmlElement 
    public void setTitle(String title) { 
     this.title = title; 
    } 

    public Date getFiles_last_modified() { 
     return filesModifiedDate; 
    } 

    @XmlElement 
    public void setFiles_last_modified(Date date) { 
     filesModifiedDate = date; 
    } 

    public Date getMetadata_last_modified() { 
     return metaModifiedDate; 
    } 

    @XmlElement 
    public void setMetadata_last_modified(Date date) { 
     metaModifiedDate = date; 
    } 

    public Date getPublished() { 
     return publishedDate; 
    } 

    @XmlElement 
    public void setPublished(Date date) { 
     publishedDate = date; 
    } 

    public String getLink() { 
     return link; 
    } 

    @XmlElement 
    public void setLink(String link) { 
     this.link = link; 
    } 

    public Requirements getRequirements() { 
     return requirements; 
    } 

    @XmlElement 
    public void setRequirements(Requirements requirements) { 
     this.requirements = requirements; 
    } 

    public Problems getProblems() { 
     return problems; 
    } 

    @XmlElement 
    public void setProblems(Problems problems) { 
     this.problems = problems; 
    } 

    public static class Requirements { 

     // Strings representing domain requirements 
     private String strips = null; 
     private String typing = null; 
     private String durative = null; // durative-actions 
     private String fluents = null; 
     private String timed = null; // time-initial-literal 
     private String equality = null; 
     private String inequalities = null; // duration_inequalities 

     public String getStrips() { 
      return strips; 
     } 

     @XmlElement(name = "strips") 
     public void setStrips(String strips) { 
      this.strips = strips; 
     } 

     public String getTyping() { 
      return typing; 
     } 

     @XmlElement(name = "typing") 
     public void setTyping(String typing) { 
      this.typing = typing; 
     } 

     public String getDurative() { 
      return durative; 
     } 

     @XmlElement(name = "durative-actions") 
     public void setDurative(String durative) { 
      this.durative = durative; 
     } 

     public String getFluents() { 
      return fluents; 
     } 

     @XmlElement(name = "fluents") 
     public void setFluents(String fluents) { 
      this.fluents = fluents; 
     } 

     public String getTimed() { 
      return timed; 
     } 

     @XmlElement(name = "timed-initial-literals") 
     public void setTimed(String timed) { 
      this.timed = timed; 
     } 

     public String getEquality() { 
      return equality; 
     } 

     @XmlElement(name = "equality") 
     public void setEquality(String equality) { 
      this.equality = equality; 
     } 

     public String getInequalities() { 
      return inequalities; 
     } 

     @XmlElement(name = "duration_inequalities") 
     public void setInequalities(String inequalities) { 
      this.inequalities = inequalities; 
     } 
    } 

    public static class Problems { 

     private ArrayList<Problem> problems; 

     public ArrayList<Problem> getProblem() { 
      return problems; 
     } 

     public void setProblem(ArrayList<Problem> problems) { 
      this.problems = problems; 
     } 

     public static class Problem { 

      private String domainFile; 
      private int number; 
      private String problemFile; 

      public String getDomain_file() { 
       return domainFile; 
      } 

      @XmlAttribute(name = "domain_file") 
      public void setDomain_file(String domainFile) { 
       this.domainFile = domainFile; 
      } 

      public int getNumber() { 
       return number; 
      } 

      @XmlAttribute 
      public void setNumber(int number) { 
       this.number = number; 
      } 

      public String getProblem_file() { 
       return problemFile; 
      } 

      @XmlAttribute(name = "problem_file") 
      public void setProblem_file(String problemFile) { 
       this.problemFile = problemFile; 
      } 

      public void addResult(Planner planner, double result) { 
       resultMap.put(planner, result); 
      } 

      public double getResult(Planner planner) { 
       return resultMap.get(planner); 
      } 

      public HashMap<Planner, Double> getResultMap() { 
       return resultMap; 
      } 
     } 
    } 
} 
} 

И файл пакета:

@XmlSchema(
    namespace = "http://planning.com", 
    elementFormDefault = XmlNsForm.QUALIFIED) 

package server; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 
+0

знак не найден! – manetsus

ответ

1

Ваш XML неверен в соответствии с вашей схемой, определенной вашими Java-объектами. Все в вашей схеме находится под пространством имен http://planning.com, но в вашем XML единственный элемент, определенный в этом пространстве имен, равен metadata. Вам необходимо:

  • Установить http://planning.com в пространство имен по умолчанию.

    <metadata xmlns="http://planning.com"> <domain id=numeric"> ...

  • Используйте префикс на всех элементах

    <planning:metadata xmlns:planning="http://planning.com"> <planning:domain id=numeric"> ...


Alternativly если XML можно считать правильным, но ваши Java-классы неверны. В этом случае просто удалите @XmlSchema аннотацию из вашего package-info.java и сделать Java следующим образом:

@XmlRootElement(name="metadata", namespace="http://planning.com") 
public class XmlDomain { 
    ... 

Вы действительно не имеет вопрос в вашем посте как commentered упоминался, так что я не уверен, если вашему спрашивать почему этот работает в 1.8, а не в 1.7 и знает, что XML неверен или просто не знал, что у вас плохой XML.

Что касается того, почему это работает в 1.8, все еще остается загадкой для меня. Я сделаю немного больше, покачиваясь в нем, и попытаюсь выяснить, почему из моего собственного любопытства.

+0

Спасибо за ваш ответ. К сожалению, XML - это единственное, что я не могу контролировать. Это формат, принятый кем-то другим, и я должен использовать его. И нет, я не знал, что я работаю с плохим XML. Мой вопрос был действительно, почему мой код не работает на 1.7, и как заставить его работать, поскольку мне не помогает, что он работает на моей собственной машине, но не на сервере. –

+1

@AYUK Ах ладно. Постарайтесь убедиться, что у вас есть четкий вопрос при публикации на SO. Это значительно увеличит шансы, что кто-то поможет вам, иначе люди будут угадывать, о чем вы спрашиваете. Отредактировал свой ответ, чтобы отразить ваш ответ. –

+0

Это работает, спасибо! В следующий раз убедитесь, что будете более четкими и точными, спасибо за ваши отзывы.К сожалению, я пока не могу подтвердить свой ответ, но, конечно, я очень счастлив. Ваша помощь очень ценится –

Смежные вопросы