在Accept标头中指定application / xml时出现HttpMediaTypeNotAcceptableException

时间:2013-07-10 22:58:25

标签: java spring spring-mvc xml-serialization

道歉,我没有看到java-noob的标签。

我在Spring工作了一个现有的restful api。我的任务是添加一个带有几个实用程序方法的新api,每个方法返回一个字符串。到现在为止还挺好。一切都运作良好。

我添加了一个简单的包装器来将字符串作为对象返回,我可以构建/部署/测试,然后我回复我的响应,看起来像

{ id: "12345" }

如果我指定Accept header = application/xml,我会收到以下异常:

  

org.springframework.web.HttpMediaTypeNotAcceptableException:找不到可接受的表示

这个包中的其他方法似乎在xml和json中都很好地序列化。我没有看到任何自定义序列化代码在控制器基础中使用,我不知道它在哪里处理(或者它甚至与序列化有关)。 有人可以帮我弄清楚从哪里开始寻找吗?

这是我的[简化]控制器:

@Controller
public class UtilController extends ControllerBase
{

    @XmlRootElement(name="util_response")
    public static class UtilResponse extends APIResponseBase
    {
        private String id;

        @XmlElement(name="id")
        public String getId()
        {
            return id;
        }

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

    @RequestMapping(value = "/{pid}/util/output", method = RequestMethod.GET)
    @ResponseBody
    public UtilResponse output(HttpServletResponse httpResponse,
            @PathVariable("pid") int pid,
            @RequestParam(value = "id", required=true) String id) throws Exception
    {
            UtilResponse utilResponse = new UtilResponse();
            utilResponse.setId(id);
            return utilResponse;
    }
}

我也尝试更新@RequestMapping并添加produces = "application/xml"(是的,显然不知道这是什么意思),但这没有效果。

说真的,我对所有这些java东西“如何工作”(.net dev by trade)非常新,并且很想了解更多。我不知道Jackson是什么,但我在项目中没有看到它的引用,其他一切似乎都有效,所以请不要回答“你为什么不用杰克逊?”我也有截止日期,所以有时只是让它工作优先。

1 个答案:

答案 0 :(得分:2)

  

请不要回答“你为什么不用杰克逊?

没有人会这么说。杰克逊是JSON;)

  

produce =“application / xml”...,但效果为零

produces将处理程序方法限制为提供的类型。因此produces="application\xml"使该方法对于期望JSON的请求不可用,例如它不会改变方法的结果。

您对问题的描述表明Spring无法找到将UtilResponse序列化为XML的方法。最可能的原因是类路径中不存在JAXB2。 Spring使用它作为默认创建XML