1

こんにちは、ウェブ上のリポジトリからデータを取得するために 7 日間試しています。特に、ここから著者のリストを取得しようとしています (URL:http://www.../base/author):

 <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 つのビューのうちの 1 つである getpage:

  <%@ 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

リポジトリからデータを受信する必要がありますが、電子メールなどに名前を付ける必要がありますが、これを受信する前に: 要求されたリソース () は利用できません。何が問題なのか理解できません。URL と受信データの間のマッピングですか? 提案はありますか?

4

1 に答える 1

2

最初の問題に関しては、JAXBアノテーションが正しいようには見えず、authors xml要素がAuthorListクラスにマップされず、author内の内部要素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;

リソースが見つからないという2番目の問題に関して、マッピングは良好に見えますが、ログレベルをトレースして何が起こっているかを確認するように設定する方がよい場合があります。

于 2012-04-27T22:46:00.920 に答える