programing

Jersey 예외 : SERVE : Java 클래스의 메시지 본문 리더

golfzon 2023. 3. 15. 20:05
반응형

Jersey 예외 : SERVE : Java 클래스의 메시지 본문 리더

JSON을 출력하는 Jersey 기반의 Rest WS가 있습니다.Jersey Client를 구현하여 WS를 호출하고 JSON 응답을 소비합니다.가지고 있는 클라이언트 코드는 다음과 같습니다.

WebResource r = restClient.resource(UriBuilder).from Uri("http://localhost/") 포트(8080).빌드();
문자열 response = r.path("/user").accept(MediaType).APPLICATION_JSON.get(String.class);
사용자 [] = r.path("/user").accept(MediaType).APPLICATION_JSON.get(사용자[.class];

두 번째 줄은 JSON 문자열 응답을 올바르게 출력하지만, 세 번째 줄은 POJO에 JSON을 마셜링하지 않고 다음 예외 스택 트레이스를 받습니다.

심각도: Java 클래스용 메시지 본문 리더 [Lorg.shoppingsite.model.entity.jpa]사용자 및 Java 유형 클래스 [Lorg.shoppingsite.model.entity.jpa]사용자 및 MIME 미디어 유형 응용 프로그램/json을 찾을 수 없습니다.2011년 12월 21일 오전 11:32:01 AM com.sun.jersey.api.client.ClientResponse getEntity심각도: MIME 미디어 유형과 호환되는 등록된 메시지 본문 리더는 다음과 같습니다.
*/* ->com.sun.core.core.core.core.core.com.폼 프로바이더com.sun.core.core.core.core.core.com.String Provider(스트링 프로바이더)com.sun.core.core.core.core.core.com.바이트 어레이 프로바이더com.sun.core.core.core.core.core.com.파일 프로바이더com.sun.core.core.core.core.core.com.Input Stream Provider(입력 스트림 프로바이더)com.sun.core.core.core.core.core.com.Data Source Providercom.sun.core.core.core.core.core.com.XMLJAXBelementProvider$일반com.sun.core.core.core.core.core.com.리더 프로바이더com.sun.core.core.core.core.core.com.Document Providercom.sun.core.core.core.core.core.com.SourceProvider$StreamSourceReadercom.sun.core.core.core.core.core.com.소스 프로바이더 $SAXSourceReadercom.sun.core.core.core.core.core.com.소스 프로바이더 $DOMSourceReadercom.sun.core.core.core.core.core.com.XMLRootElementProvider$일반com.sun.core.core.core.core.core.com.XMLListElementProvider$일반com.sun.core.core.core.core.core.com.XMLRootObjectProvider$Generalcom.sun.core.core.core.core.core.com.Entity Holder Reader

요청에 올바른 MIME TYPE이 있습니다.내 POJO에는 XMLRootElement 주석이 붙어 있습니다.내가 뭘 놓쳤지?

감사해요.

두 가지만 하면 됩니다.누락된 경우 확인:

  1. 먼저 오브젝트 클래스/엔티티에 @XmlRootElement 주석이 필요합니다.
  2. 누락된 경우 jersey-json에 종속성을 추가해야 합니다.참고로 이 의존관계를 pom.xml에 추가했습니다.

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.17.1</version>
    </dependency>
    

저는 jersey-json에 maven 의존성을 추가하여 문제를 해결할 수 있었습니다.

이것만 넣어주세요

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

이 게시물이 오래되고 오래전에 알아냈다는 건 알지만, 언젠가 이 글을 읽을 사람들을 구하기 위해서야.

엔드포인트에 전달하는 엔티티에 주석을 추가하는 것을 잊어버렸을 수 있으므로 Jersey는 수신한 POJO를 처리하는 방법을 알 수 없습니다.다음과 같은 방법으로 pojo에 주석을 추가합니다.

@XmlRootElement(name = "someName")

uberjar 또는 "shaded jar"를 빌드하는 경우 meta inf 서비스 파일이 병합되었는지 확인하십시오.(드롭위저드 프로젝트에서 여러 번 물어뜯었습니다.)

플러그인을 gradle shadowJar를 합니다.mergeServiceFiles() 안에서shadowJar대상: https://github.com/johnrengelman/shadow#merging-service-files

메이븐 또는 다른 빌드 시스템에 대해 유사한 명령이 무엇인지 확실하지 않습니다.

저 같은 경우에는 POJO를 쓰고 있어요.그리고 POJOMapping Feature를 true로 설정하는 것을 잊었습니다.메이콘은 이른 답변에서 그것을 지적했다.그러나 web.xml에서 올바르게 설정할 수 없는 경우도 있습니다.다음은 예를 제시하겠습니다.

<servlet>
    <servlet-name>Jersey Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

우리는 또한 저지를 해결책으로 사용하기로 결정했다.근데 우리가 org를 쓰니까.대부분의 경우 JSON은 이 의존관계가 불필요하고 우리는 기분이 좋지 않았다.

따라서 String 표현을 사용하여 조직을 취득했습니다.JSON 오브젝트 대신

JSONObject output = response.getEntity(JSONObject.class); 

현재는 다음과 같이 사용하고 있습니다.

JSONObject output = new JSONObject(response.getEntity(String.class)); 

여기서 JSONObject는 org에서 유래합니다.JSON 및 Import는 다음에서 변경할 수 있습니다.

-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;

수업 시작 전에 POJO에 아래 줄을 추가하기만 하면 문제가 해결됩니다.@Products("application/json") @XmlRootElement javax.ws.rs의 Import 예를 참조하십시오.javax.xml.bind.annotation을 생성하고 Import합니다.XmlRootElement;

 /**
 * @author manoj.kumar
 * @email kumarmanoj.mtech@gmail.com
 */
 @Produces("application/json")
 @XmlRootElement  
 public class User {

 private String username;
 private String password;
 private String email;
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
     this.username = username;
 }
 public String getPassword() {
     return password;
 }
 public void setPassword(String password) {
     this.password = password;
 }
 public String getEmail() {
    return email;
 }
 public void setEmail(String email) {
    this.email = email;
 }

}
add below lines inside of your web.xml
<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>  
Now recompile your webservice everything would work!!!

추가 시도:

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

이 는 '어울릴까 보다'를 사용하는 할 수 .HTTP GET하여 이 경우 lib를 추가합니다.@XmlRootElement「web.xml」을 참조해 주세요. 을 합니다.QueryParam ★★★★★★★★★★★★★★★★★」HTTP POST.

합니다.MessageBodyReader ★★★★★★★★★★★★★★★★★」MessageBodyWriter의 반을 위해서Lorg.shoppingsite.model.entity.jpa.User

package javax.ws.rs.ext;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

public interface MessageBodyReader<T extends Object> {

    public boolean isReadable(Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public T readFrom(Class<T> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType, 
        MultivaluedMap<String, String> httpHeaders, 
        InputStream entityStream) throws IOException, WebApplicationException;
}

package javax.ws.rs.ext;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

public interface MessageBodyWriter<T extends Object> {

    public boolean isWriteable(Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public long getSize(T t, 
        Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public void writeTo(T t, 
        Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType, 
        MultivaluedMap<String, Object> httpHeaders, 
        OutputStream entityStream) throws IOException, WebApplicationException;
}

다른 인스턴스를 실행하고 있는지 확인만 하면 됩니다.다른 세션을 모두 종료하고 새로 빌드하여 문제를 해결했습니다.

어떤 사람들은 왜 jersey-json jar를 추가하는 것이 이 문제를 해결할 수 없는지 혼란스러워 할 수 있다.나는 이 병이 jersey-json-1.7.jar보다 더 최신이라는 것을 알았다(1.7.0은 동작하지 않지만 1.7.1은 동작한다).이것이 도움이 되기를 바란다

Python 및 Swagger의 예:

import requests
base_url = 'https://petstore.swagger.io/v2'
def store_order(uid):
    api_url = f"{base_url}/store/order"
    api_data = {
        'id':uid,
        "petId": 0,
        "quantity": 0,
        "shipDate": "2020-04-08T07:56:05.832Z",
        "status": "placed",
        "complete": "true"
        }
    # is a kind of magic..
    r = requests.post(api_url, json=api_data)
    return r
print(store_order(0).content)    

MIME 유형의 가장 중요한 문자열: r = requests.post(api_url, json=api_data)

Q) 코드는 Intelj에서는 정상적으로 동작하고 있었지만 명령줄에서는 동작하지 않았습니다.

Sol) jersey의 의존관계를 일시적인 의존관계가 아닌 직접 의존관계로 추가합니다.

이유:IntelliJ에서는 정상적으로 동작하고 있었기 때문에, 의존관계는 올바르게 설정되어 있습니다.

  1. 다음 중 하나를 사용하여 필요한 종속성을 가져옵니다.

    1. IntelliJ 실행 명령어를 확인합니다.스택오버플로우링크
    2. maven으로부터의 mvn dependency:tree
  2. 이제 문제의 저지 의존성을 명시적으로 추가해 주세요.

Java 버전(내 경우 1.8)을 업데이트하여 수정할 수 있었습니다.나는 com에서 get 메서드를 사용하고 있었다.sun.disc.api.client.Web Resource.entity(), .accept().get().

나도 비슷한 상황이었어.중요한 때에 이 에러가 발생하는데, 그 전에 어떻게 풀었는지 기억이 나지 않습니다.몇 번이나 풀었습니다.오랜 시간 동안 점검한 후 오류를 해결하고 재현했으며, 이 상황에 대한 해결책이 얼마나 간단한지 확인했습니다.

OK - 해결 방법 : 메인 프로젝트의 속성 파일에서 새로 변경한 내용을 모두 삭제(또는 수정)합니다.

네, 이것이 그것입니다.사실, 제 프로젝트는 멀티모듈로 이루어진 거대한 프로젝트입니다.또한 git(RAC도 마찬가지)에서 자주 가져오기 때문에 올바른 의존관계를 갖지 않는 것은 드문 시나리오입니다.프로젝트에서는 구성 가능한 거의 모든 것을 15개 정도의 모듈(하위 프로젝트)에 공통되는 속성 파일에서 가져와 상호 의존성이 상당히 높았습니다.Jersey-json의 의존은 항상 우리 부모님 폼에 있어XML 주석은 프로젝트를 수정한 후 약 100회 실행되므로 문제가 되지 않습니다.여기서는 web.xml이나 POJOMapping Feature 등을 가리키는 솔루션도 있습니다.저 같은 경우에는 이 빌드에서 웹 앱 모듈을 건드리지도 않았습니다.어쨌든, 이 솔루션은 나에게 있어서 효과가 있었고, 만약 이 에러에 빠지면, 나는 졸린 밤을 낭비하지 않아도 되기 때문에, 이것을 SO에 기록하는 데 시간을 할애하고 있습니다.(물론 당신도)

언급URL : https://stackoverflow.com/questions/8594707/jersey-exception-severe-a-message-body-reader-for-java-class

반응형