首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泽西岛的URI扩展(.xml,.json)

泽西岛的URI扩展(.xml,.json)
EN

Stack Overflow用户
提问于 2016-09-06 12:35:23
回答 2查看 178关注 0票数 1

我正在尝试使用泽西岛创建一个通用的REST,并遵循下面的博客:https://theza.ch/2009/08/11/uri-extensions-in-jersey/

所以,当我在url中使用.xml时,服务器正常工作,当我使用.json时,它会给出500个内部服务器错误。我尝试过不同的东西,但都没有用。有谁能知道为什么在json中会发生这种情况,而不是针对xml,以及如何解决这个问题呢?

我的代码如下所示:

代码语言:javascript
复制
@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();
    }
}

更新:

在添加json依赖项之后,500错误更改为200 OK,但我仍然得到一个空的响应。对于xml,我得到了预期的响应。有人面临过类似的问题吗?请给我一些建议,因为我尝试过其他答案中的一些东西,但似乎不管用。

StackTrace:

代码语言:javascript
复制
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,Jersey-jsonVersion1.8。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-07 14:19:21

我花了很长时间来解决这个问题之后,我转向了genson,

代码语言:javascript
复制
        <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>1.3</version>
        </dependency>

它很容易就成功了。以后再找杰克逊不工作的原因。

票数 2
EN

Stack Overflow用户

发布于 2016-09-07 09:54:19

按照注释中的建议添加jar依赖项之后,

您需要有额外的参数来决定xml或名为“format”的json,所以现在您可以这样做,方法是按如下所示更改返回语句

代码语言:javascript
复制
@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();
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39349168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档