【问题标题】:URI extensions in Jersey (.xml, .json)Jersey 中的 URI 扩展名(.xml、.json)
【发布时间】:2016-09-06 12:35:23
【问题描述】:

我正在尝试使用 Jersey 制作通用 REST api,为此我关注了以下博客: https://theza.ch/2009/08/11/uri-extensions-in-jersey/

所以发生的事情是,当我在我的 url 中使用 .xml 时,服务器工作正常,当我使用 .json 时,它给出了 500 Internal Server 错误。我尝试了不同的东西,但无济于事。任何人都可以通过任何更改知道为什么会在 json 而不是 xml 中发生这种情况以及如何解决这个问题?

我的代码如下所示:

@GET
@Path("/order/{product-key}/getorderid")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Response getOrderIdByDomain(@Context HttpServletRequest request,
                                   @PathParam("product-key") final String productKey,
                                   @QueryParam("domain-name") final String domainName ) throws Exception
{
    try
    {
        Integer response = doSomething();

        return Response.status(200).entity(response).build();
    }
    catch (Exception lbe)
    {
        Hashtable response = new Hashtable();
        response.put("Error",lbe.getMessage());
        return Response.status(400).entity(response).build();
    }
}

更新:

添加 jersey-json 依赖后,500 错误变为 200 OK,但我仍然得到一个空响应。对于 xml,我得到了预期的响应。有人遇到过类似的问题吗?请提出一些建议,因为我已经从其他答案中尝试了一些东西,但它似乎不起作用。

堆栈跟踪:

Caused by: java.lang.AbstractMethodError
at org.codehaus.jackson.map.AnnotationIntrospector$Pair.findSerializer(AnnotationIntrospector.java:1148)
at org.codehaus.jackson.map.ser.BasicSerializerFactory.findSerializerFromAnnotation(BasicSerializerFactory.java:362)
at org.codehaus.jackson.map.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:252)
at org.codehaus.jackson.map.ser.StdSerializerProvider._createUntypedSerializer(StdSerializerProvider.java:782)
at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(StdSerializerProvider.java:735)
at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(StdSerializerProvider.java:344)
at org.codehaus.jackson.map.ser.StdSerializerProvider.findTypedValueSerializer(StdSerializerProvider.java:420)
at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:601)
at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256)
at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1606)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:520)
at com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.writeTo(JacksonProviderProxy.java:160)
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1437)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
... 48 more

我正在使用以下依赖项:jersey-server、jersey-json 版本 1.8。

【问题讨论】:

  • 我认为您缺少 jackson 的一些依赖项,请参考此内容并将其包含在您的项目中 stackoverflow.com/questions/18429468/…
  • 您能与我们分享异常堆栈跟踪吗?
  • 该教程已经有将近 7 年的历史了,它基于 old Jersey 1.x。你在做一些新的吗?你有没有考虑过使用 Jersey 2.x?
  • @JekinKalariya 添加杰克逊依赖项确实有帮助。我现在得到 200,但回复是空的。而对于 xml,我得到了预期的响应。
  • @JekinKalariya 还有什么你认为我可能错过的吗?

标签: java jersey


【解决方案1】:

在尝试了很长时间解决这个问题后,我切换到了genson,

        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>1.3</version>
        </dependency>

它很容易工作。稍后会尝试找出 Jackson 不工作的原因。

【讨论】:

    【解决方案2】:

    按照评论中的建议添加 jar 依赖项后,
    您需要有额外的参数来决定名为“格式”的 xml 或 json,所以现在您可以通过如下更改 return 语句来做到这一点

    @GET
        @Path("/order/{product-key}/{format}/getorderid")
        @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
        public Response getOrderIdByDomain(@Context HttpServletRequest request,
                                           @PathParam("product-key") final String productKey,@PathParam("format") final String format,
                                           @QueryParam("domain-name") final String domainName ) throws Exception
        {
            try
            {
                Integer response = doSomething();
    
               return Response
                    // Set the status and Put your entity here.
                    .ok(entity)
                    // Add the Content-Type header to tell Jersey which format it should marshall the entity into.
                    .header(HttpHeaders.CONTENT_TYPE, "json".equals(format) ? MediaType.APPLICATION_JSON : MediaType.APPLICATION_XML)
                    .build();
            }
            catch (Exception lbe)
            {
                Hashtable response = new Hashtable();
                response.put("Error",lbe.getMessage());
                return Response.status(400).entity(response).build();
            }
        }
    

    【讨论】:

    • 我知道这种方法可以实现这一点,但我不想发送额外的 PathParam 并且我在我的问题中发布的链接声称正在这样做。我想弄清楚我做错了什么。
    • 你能告诉我你插入了哪些罐子,并把你的请求从客户端调用
    • @Jekin,他可以指定他期望客户端的响应类型(例如使用 request.accept(MediaType.APPLICATION_JSON)
    • 服务器(Jersey)必须查找请求标头并查看接受属性中指定的类型,然后创建 JSON 或 XML。
    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多