2012-04-27 21 views
1

皆さん、こんにちは、私は7日間、ウェブ上のリポジトリからデータを取得しようとしています。特に、私は(URLを有します。http://www.../base/author):ここから著者のリストを取得しようSpring MVCを使用してリポジトリからXMLメタデータを取得

<authors xmlns="http:www.../base" xmlns:atom="http://www.w3.org/2005/atom"> 
    <author> 
     <atom:link rel="author" type="application/xml" href="http://www.../base/author/1"/> 
    </author> 
    <author> 
     <atom:link rel="author" type="application/xml" href="http://www.../base/author/2"/> 
    </author> 
    <author> 
     <atom:link rel="author" type="application/xml" href="http://www.../base/author/3"/>   
    </author> 
</authors> 

そして、別々に、ここから各著者:

<author xmlns="http://http:www.../base" xmlns:atom="http://www.w3.org/2005/atom"> 
    <name>S. Crocker</name> 
    <address>None</address> 
    <affiliation></affiliation> 
    <email>None</email> 
</author> 

私のモデルクラスは次のとおりです。

import javax.xml.bind.annotation.XmlRootElement; 

    @XmlRootElement(name="author") 
    public class Author { 

private Long id; 
private String name; 
private String address; 
private String affiliation; 
    private String email; 

public Long getId() { 
    return id; 
} 
public void setId(Long id) { 
    this.id = id; 
} 
public String getName() { 
    return name; 
} 
public void setFirstName(String name) { 
    this.name = name; 
} 
public String getAddress() { 
    return address; 
} 
public void setAddress(String address) { 
    this.address = address; 
} 
public String getAffiliation() { 
    return affiliation; 
} 
public void setAffiliation(String affiliation) { 
    this.affiliation = affiliation; 
} 
public String getEmail() { 
    return email; 
} 
public void setEmail(String email) { 
    this.email = email; 
} 

} 

そして:

import java.util.List; 

    import javax.xml.bind.annotation.XmlRootElement; 

    @XmlRootElement(name="authors") 
    public class AuthorList { 

private List<Author> data; 

public List<Author> getData() { 
    return data; 
} 

public void setData(List<Author> data) { 
    this.data = data; 
} 

}

コントローラ:

public class Controller { 

protected static Logger logger = Logger.getLogger("controller"); 

private RestTemplate restTemplate = new RestTemplate(); 

/** 
* Retrieves all records from the REST provider 
* and displays the records in a JSP page 
*/ 
@RequestMapping(value = "/authors", method = RequestMethod.GET)//getall 
public String getAll(Model model) { 


    // Prepare acceptable media type 
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>(); 
    acceptableMediaTypes.add(MediaType.APPLICATION_XML); 

    // Prepare header 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setAccept(acceptableMediaTypes); 
    HttpEntity<Author> entity = new HttpEntity<Author>(headers); 

    // Send the request as GET 
    try { 
     ResponseEntity<AuthorList> result = restTemplate.exchange("href="http://www.../base/author/", 
         HttpMethod.GET, entity, AuthorList.class); 
     // Add to model 
     model.addAttribute("authors", result.getBody().getData()); 

    } catch (Exception e) { 
    } 

    // This will resolve to /WEB-INF/jsp/personspage.jsp 
    return "personspage"; 
} 

/** 
* Retrieves a single record from the REST provider 
* and displays the result in a JSP page 
*/ 
@RequestMapping(value = "/author", method = RequestMethod.GET) 
public String getPerson(@RequestParam("id") Long id, Model model) { 


    // Prepare acceptable media type 
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>(); 
    acceptableMediaTypes.add(MediaType.APPLICATION_XML); 

    // Prepare header 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setAccept(acceptableMediaTypes); 
    HttpEntity<Author> entity = new HttpEntity<Author>(headers); 

    // Send the request as GET 
    try { 
     ResponseEntity<Author> result = restTemplate.exchange("href="http://www.../base/author/{id}", 
          HttpMethod.GET, entity, Author.class, id); 
     // Add to model 
     model.addAttribute("author", result.getBody()); 

    } catch (Exception e) { 
    } 

    // This will resolve to /WEB-INF/jsp/getpage.jsp 
    return "getpage"; 
} 




} 

そして最後に2つのビュー、GETPAGEの1:ちょうど私が取るプログラムを実行wheni今

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
    <%@page contentType="text/html" pageEncoding="UTF-8"%> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html4/loose.dtd"> 

    <html> 
    <head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Insert title here</title> 
</head> 
<body> 
<h1>Get Author</h1> 

<c:if test="${empty author}"> 
No records found! 
</c:if> 

<c:if test="${!empty author}"> 
<table style="border: 1px solid #333"> 
    <tr> 
    <td style="width: 100px">Id</td> 
    <td>${author.id}</td> 
    </tr> 

    <tr> 
    <td>Name</td> 
    <td>${author.name}</td> 
    </tr> 

    <tr> 
    <td>Address</td> 
    <td>${author.address}</td> 
    </tr> 

    <tr> 
    <td>Affiliation</td> 
    <td>${author.affiliation}</td> 
    </tr> 

      <tr> 
    <td>Email</td> 
    <td>${author.email}</td> 
    </tr> 
</table> 
</c:if> 

、表示されるビュー:

該当するレコードは見つかりませんでした!

と私は、次のURL与えるとき: http://localhost:8080/Client_for_rest/author?id=1

を私は、reposioryからデータを受信名前メールアドレスなど しかしintead私はこれを受ける必要があります。 要求されたリソースは、()は使用できません。 私は問題は何か、URLの 受信したデータの間のマッピングを理解できませんか? 提案はありますか?

答えて

2

最初の問題については、JAXB注釈が正しいと思われません。authors xml要素はAuthorListクラスにマップされず、author内の内部要素作成者はAuthorクラスにマップされず、名前空間はマップされません。説明される。

私はJAXB注釈にいくつかの簡単な修正が可能性を考える: あなたはクラスのカップルを定義することができます。 AtomLink: @XmlAccessorType(XmlAccessType.FIELD)

public class Atomlink { 
    @XmlAttribute 
    private String rel; 
    @XmlAttribute 
    private String type; 
    @XmlAttribute 
    private String href; 
    ....... 

AuthorMeta、著者を表現するために著者内のタグ:

@XmlAccessorType(XmlAccessType.FIELD) 
public class AuthorMeta { 

    @XmlElement(name="link", namespace="http://www.w3.org/2005/atom") 
    private Atomlink link; 

    public Atomlink getLink() { 
     return link; 
    } 

    public void setLink(Atomlink link) { 
     this.link = link; 
    } 
} 

、最終的にAuthorListあなたが既に持っているように、しかし、と名前空間:

@XmlRootElement(name = "authors", namespace="http:www.../base") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class AuthorList { 

    private List<AuthorMeta> author; 

    public List<AuthorMeta> getAuthor() { 
     return author; 
    } 

    public void setAuthor(List<AuthorMeta> data) { 
     this.author = data; 
    } 
} 

これは、きれいにバインドできないという最初の問題に注意する必要があります。あなたが同じラインに沿って、著者の結果のバインディングを定義する必要があります

@XmlRootElement(name = "author", namespace="http://http:www.../base") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Author { 
    private String name; 
    private String address; 
    private String affiliation; 
    private String email; 

今リソースのあなたの第二の問題は、マッピングがよさそうだfound..theないについては、それができると便利ログレベルをトレースに設定し、何が起こっているかを確認してください。

関連する問題