@ResponseBody无法在Java 6中生成XML


问题内容

我有一个Spring MVC 3 / J2EE项目。jsp呈现控制器可以正常工作,但是为Ajax呈现XML的一个控制器无法正常工作。我在RAD
7.5中使用JDK 1.6,因此JAXB应该在类路径中,甚至我尝试将最新的JAXB jar添加到lib文件中以确保。 拨打电话时仍然出现406错误。
我的DOJO调用具有handleAs: "xml",我已经通过FireBug
确认了application/xml它在Accept标题上。我的<mvc:annotation-driven />spring servlet
xml文件中有一行。我可以看到该方法正在被调用并返回而没有错误。我不确定下一步应该尝试什么进行调试。

//Country is a class with only primative types which implements Serializable.
public @ResponseBody List<Country> getCountries(){
    return addressService.getCountries();
}

function loadData(){
    console.log("Before get ...");
    dojo.xhrGet({
        url:"http://localhost:9080/sample/shared/getCountries.htm",
        handleAs:"xml",
        load: function(data){
            console.log("In load function ...");
            try {
                for(var i in data){
                   console.log("key", i, "value", data[i]);
                }
            }catch (ex){
                console.error("Failure in load function: " + ex);
            }
            console.log("Exiting load function ...");
        },
        error: function(x){
            console.error("Error in ajax ...");
            console.error(x);
        },
        failOk: false
    });
    console.log("After get ...");
}

问题答案:

尝试创建以下包装器类:

@XmlRootElement
class Countries {
    private List<Country> countries = new ArrayList<Country>()

    //getters/setters
}

并从控制器而不是原始列表返回它:

public @ResponseBody Countries getCountries()

您的问题很可能是由无法整理Java列表的JAXB引起的(它不知道如何命名XML文档的根标记)。请注意,在JSON中请求数据时,如果您的CLASSPATH中有Jackson可用,则可能不会发生您的问题。