【问题标题】:Java Jersey REST NoSuchMethodError: XMLUnmarshallerJava Jersey REST NoSuchMethodError: XMLUnmarshaller
【发布时间】:2017-12-22 11:54:57
【问题描述】:

我创建了一个小型 REST API,但我在使用和生成 MediaType.APPLICATION_JSON 的 POST 方法上遇到问题。当我发送 POST 服务器(GlassFish 4.1.1)返回状态码 500 Internal Server Error 以及以下错误:

java.lang.NoSuchMethodError: org.eclipse.persistence.oxm.XMLUnmarshaller.setNamespaceResolver(Lorg/eclipse/persistence/oxm/NamespaceResolver;)V

我读了post 并更改了版本org.eclipse.persistance.moxy。它不能解决我的问题。

我使用 Maven,我的依赖实际上是这样的:

<dependencies>
    <dependency>
        <groupId>org.eclipse.persistence</groupId>
        <artifactId>eclipselink</artifactId>
        <version>2.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.26</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.16</version>
    </dependency>
</dependencies>

请帮我解决这个问题。

编辑。 这是POST方法的示例代码:

import java.net.URI;
import java.util.List;
import java.util.concurrent.ExecutorService;
import javax.validation.Valid;
import javax.ws.rs.BeanParam;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.container.AsyncResponse;
import javax.ws.rs.container.Suspended;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.GenericEntity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;  

@Path("/adverts")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class AdvertsResources {

@POST
public void addAdvert(@Suspended final AsyncResponse asyncResponse,
                      @Valid final Advert advert,
                      @Context final UriInfo uriInfo) {
    executorService.submit(new Runnable() {
        @Override
        public void run() {
            asyncResponse.resume(doAddAdvert(advert, uriInfo));
        }
    });
}

private Response doAddAdvert(@Valid Advert advert,
                             @Context UriInfo uriInfo) {
    Advert newAdvert = advertService.addAdvert(advert);
    String newId = String.valueOf(newAdvert.getId());
    URI newUri = uriInfo.getAbsolutePathBuilder().path(newId).build();

    return Response.created(newUri)
            .entity(newAdvert)
            .build();
}
}

@编辑

你好,

我用 JSON 和 POST 方法解决了我的问题。我的工作:

1) 将 GlassFish 4.1.1 更改为 GlassFish 4.1

2) 添加依赖

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-server</artifactId>
        <version>1.8</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.8</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-binding</artifactId>
        <version>2.26</version>
    </dependency>

【问题讨论】:

    标签: java rest maven jersey glassfish


    【解决方案1】:

    不看代码和完整栈,很难定位问题,但是NoSuchMethodError的根本原因 很可能针对缺少方法的类的不同版本编译了一个类,而不是您在运行它时使用的版本。

    如果应用程序尝试调用类的指定方法时抛出 (静态或实例),并且该类不再有定义 那个方法。

    因此,在编译和部署的服务器上验证库列表及其版本(特别是 eclipselink)。

    【讨论】:

    • 感谢您的评论。我正在尝试重新编译所有类并更改依赖项,但它仍然不起作用。我编辑了我的第一篇文章并添加了一些 POST 方法的示例代码。
    • @atezor 请注意,NoSuchMethodErrorError,这意味着它只会在运行时发生。因此,您需要确保在运行时拥有相同的库(甚至是它们的版本)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 2015-04-15
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多