2017-12-22 6 views
0

작은 REST API를 만들고 POST 메서드에 문제가있어 MediaType.APPLICATION_JSON을 생성하고 생성합니다. 내가 POST 서버 (글래스 피쉬 4.1.1) 상태 코드 500 내부 서버 오류뿐만 아니라 다음과 같은 오류를 반환 보낼 때 : Java Jersey REST NoSuchMethodError : XMLUnmarshaller

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

나는이 post를 읽고 버전 org.eclipse.persistance.moxy을 변경했습니다. 내 문제가 해결되지 않습니다. 내가 메이븐 내 의존성을 사용

사실은 다음과 같습니다

<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> 

날이 문제를 해결 도와주세요.

편집. 내가 JSON과 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(); 
} 
} 

@EDIT

안녕하세요, : 그것은 POST 방식의 샘플 코드입니다. 내가 무엇 :

1) 변경 글래스 피쉬 4.1.1 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> 

답변

0

추가 GlassFish의에,이 문제를 정확하게 파악하는 것은 매우 어렵습니다, NoSuchMethodError 의 근본 원인은 실행시 사용할 클래스가 아닌 다른 버전의 클래스를 컴파일했을 가능성이 큽니다.

Thrown if an application tries to call a specified method of a class (either static or instance), and that class no longer has a definition of that method.

그래서, 도서관, 컴파일 동안 해당 버전 (특별히 eclipselink)의 목록을 확인하고 배포 서버에서.

+0

의견을 보내 주셔서 감사합니다. 모든 클래스를 다시 컴파일하고 종속성을 변경하려고하지만 여전히 작동하지 않습니다. 첫 번째 게시물을 편집하고 POST 메서드의 샘플 코드를 추가합니다. – atezor

+0

@atezor'NoSuchMethodError'는 런타임 중에 만 발생한다는 '오류'입니다. 따라서 런타임시 동일한 라이브러리 (버전 포함)를 가지고 있는지 확인해야합니다. – Ravi

관련 문제