java - JAXB - 从 url 解码

标签 java xml jaxb

我正在尝试显示来自该站点的游戏的标题和 ID: http://thegamesdb.net/api/GetGame.php?id=2

当我从这个 url 解码时:http://www.w3schools.com/xml/note.xml一切都很好,但这里只有一个对象,而不是列表。所以我现在有问题。我正在阅读 Google 的一些教程和示例,并编写了以下代码:

数据.java:

@XmlRootElement( name = "Data" )
@XmlAccessorType (XmlAccessType.FIELD)
public class Data {
    @XmlElement(name = "Game")
    List<Game> games;

    public List<Game> getGames() {
        return games;
    }

    public void setGames(List<Game> games) {
        this.games = games;
    }
}

游戏.java文件:

@XmlRootElement(name = "Game")
@XmlAccessorType (XmlAccessType.FIELD)
public class Game {
    private int id;
    private String gameTitle;

    public int getId(){
        return id;
    }

    public void setId(int id){
        this.id = id;
    }

    public String getGameTitle(){
        return gameTitle;
    }

    public void setGameTitle(String gameTitle){
        this.gameTitle = gameTitle;
    }
}

Controller :

@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView home(Locale locale) throws MalformedURLException {
    ModelAndView model = new ModelAndView("index");
    JAXBExample test = new JAXBExample();
    Game customer = test.readXML();
    model.addObject("customer", customer);
    return model;
}

JAXBExample.java:

public class JAXBExample {
    public Game readXML() throws MalformedURLException {
        Data customer = null;
        Game game = null;
        try {
            JAXBContext jaxbContext  = JAXBContext.newInstance(Data.class);
            URL url = new URL("http://thegamesdb.net/api/GetGame.php?id=2");
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            customer = (Data) jaxbUnmarshaller.unmarshal(url);
            List<Game> games = customer.getGames();
            game = games.get(0);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return game;
    }
}

和index.jsp:

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>

<tiles:insertDefinition name="defaultTemplate">
    <tiles:putAttribute name="body">
        Name: ${customer.gameTitle}<br />
        Id: ${customer.id}<br />
    </tiles:putAttribute>
</tiles:insertDefinition>

但是我的代码不起作用。有人可能知道我做错了什么?因为结果我得到:

Name:
Id: 

仅此而已。

最佳答案

你的注释唯一有问题的是

public class Game {
  private int id;
  @XmlElement(name = "GameTitle") //You need to add this since first letter is uppercase, otherwise the GameTitle will not unmarshall.
  private String gameTitle; 
  ... your code ...
}

那么为什么其余部分不起作用?

Server returned HTTP response code: 403 for URL: http://thegamesdb.net/api/GetGame.php?id=2

403 = Forbidden

解决方案(让服务器相信你是浏览器)

URL url = new URL("http://thegamesdb.net/api/GetGame.php?id=2");
HttpURLConnection http = (HttpURLConnection) url.openConnection(); 
http.addRequestProperty("User-Agent", "Mozilla/4.76"); 
InputStream is = http.getInputStream();
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
customer = (Data) jaxbUnmarshaller.unmarshal(is);
List<Game> games = customer.getGames();
game = games.get(0);

注意:Try catch final、关闭流和检查 NullPointer 超出了这个示例,由用户决定。

关于java - JAXB - 从 url 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34278493/

相关文章:

淡入透明的Android渐变背景

c# - 如何删除 foreach 循环中的 xmlnode?

Java 平均函数

java - Eclipse 代码完成 (Java)/IntelliSense,类似于 Visual Studio (C#)

java字符串定界符,在 token 中保留定界符

java - 通知演示者模型已更改

xml - 如何在 DTD 上声明具有相同名称(在 XML 上)的元素?

java - 使用 jaxb-xjc 生成额外的自定义方法

linux - Java 8 Javadoc 与 XJC 警告和错误

java - JAXB - 如何仅在子标签中设置 xmlns 和前缀