programing

미디어 유형=application/json에 대한 MessageBodyReader를 찾을 수 없습니다.

batch 2023. 2. 25. 20:08
반응형

미디어 유형=application/json에 대한 MessageBodyReader를 찾을 수 없습니다.

JAX-RS 서버와 클라이언트 모두 Jersey를 사용하고 있습니다.엔티티 컬렉션을 클라이언트에 송신하고 싶은 경우는, 다음의 순서를 실행했습니다.

  1. 엔티티 확장 시리얼화 가능
  2. 커스텀 프로바이더를 작성하여 컬렉션을 지원하기 위해 확장
  3. 엔티티 및 프로바이더를 클라이언트 측에 복사 붙여넣기

요청을 하면 클라이언트가 다음 오류를 수신하여 서버에서 정상적으로 처리되었습니다.

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json, type=interface java.util.List, genericType=java.util.List<model.HotelsEntity>.
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:225)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:149)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:853)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:812)
org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:377)
org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:813)
org.glassfish.jersey.client.JerseyInvocation.access$600(JerseyInvocation.java:90)
org.glassfish.jersey.client.JerseyInvocation$3.call(JerseyInvocation.java:693)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:228)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:424)
org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:689)
org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:405)
org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:301)
service.HotelService.getHotels(HotelService.java:30)
actions.HotelAction.perform(HotelAction.java:42)
MainServlet.processResponse(MainServlet.java:33)
MainServlet.doPost(MainServlet.java:22)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

서버:

    @GET
@Produces(MediaType.APPLICATION_JSON)
public Response getHotelsList(@QueryParam("startDate") String startDate,
                              @QueryParam("endDate") String endDate) {
    List<HotelsEntity> list = hotelService.getAll();
    return ResponseFactory.response(Response.Status.OK, list);
}

클라이언트:

    GenericType<List<HotelsEntity>> genericType = new GenericType<List<HotelsEntity>>(){};
    WebTarget target = client.target(preparePath());
    List<HotelsEntity> hotels = target.request(MediaType.APPLICATION_JSON_TYPE).get(genericType);

프로바이더:

public class JsonProvider<T> implements MessageBodyReader<T>, MessageBodyWriter<T> {

@Override
public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
    return MediaType.APPLICATION_JSON.equals(mediaType.getType()) &&
            MediaType.APPLICATION_JSON.equals(mediaType.getSubtype());
}

@Override
public T readFrom(Class<T> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
    Gson gson = createGson();
    Reader reader = new InputStreamReader(entityStream, Charset.forName(Constants.UTF_8));
    return gson.fromJson(reader, genericType);
}

@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
    return MediaType.APPLICATION_JSON.equals(mediaType.getType()) &&
            MediaType.APPLICATION_JSON.equals(mediaType.getSubtype());
}

@Override
public long getSize(T t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
    return -1;
}

@Override
public void writeTo(T t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
    Gson gson = createGson();
    JsonElement element = gson.toJsonTree(entityStream);
    Writer writer = null;
    try {
        writer = new OutputStreamWriter(entityStream, Charset.forName(Constants.UTF_8));
        gson.toJson(element, writer);
    } finally {
        if (writer != null) {
            writer.flush();
        }
    }
}

private Gson createGson() {
    return new GsonBuilder().setPrettyPrinting().create();
}

}

@Provider
public class JsonCollection extends JsonProvider<Collection<? extends HospitalityEntity>> {}

@Entity
@Table(name = "hotels", schema = "", catalog = "mydb")
public class HotelsEntity implements HospitalityEntity{
private int idHotel;
private String name;
private String region;
private String description;

@Id
@Column(name = "id_hotel")
public int getIdHotel() {
    return idHotel;
}

public void setIdHotel(int idHotel) {
    this.idHotel = idHotel;
}

@Basic
@Column(name = "name")
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

@Basic
@Column(name = "region")
public String getRegion() {
    return region;
}

public void setRegion(String region) {
    this.region = region;
}

@Basic
@Column(name = "description")
public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}


@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    HotelsEntity that = (HotelsEntity) o;

    if (idHotel != that.idHotel) return false;
    if (description != null ? !description.equals(that.description) : that.description != null) return false;
    if (name != null ? !name.equals(that.name) : that.name != null) return false;
    if (region != null ? !region.equals(that.region) : that.region != null) return false;

    return true;
}

@Override
public int hashCode() {
    int result = idHotel;
    result = 31 * result + (name != null ? name.hashCode() : 0);
    result = 31 * result + (region != null ? region.hashCode() : 0);
    result = 31 * result + (description != null ? description.hashCode() : 0);
    return result;
}
}

jersey json 라이브러리를 사용할 수 있습니다.

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.22</version>
</dependency>

또는 genson:

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

이 게시물을 부활시켜 죄송하지만, 저는 Maven 프로젝트에서 이 문제를 겪고 있었고, 제가 다음 항목에 대한 종속성을 포함해야 한다는 것을 알게 되었습니다.jackson-jaxrs-json-provider내 폼에:

<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.4.1</version>
</dependency>

MVN 저장소: http://mvnrepository.com/artifact/com.fasterxml.jackson.jaxrs/jackson-jaxrs-json-provider

엔티티 클래스에 JAX-RS 마셜링 해제에 필요한 빈 생성자가 없습니다.

여기를 봐주세요.

https://blogs.oracle.com/groundside/entry/jax_rs_2_0_messagebodyreader

JSON 지원을 위해 미디어 유형을 등록하는 경우 선택합니다.수업시간에 저지 미디어 묵시 있어요?그렇지 않은 경우 이 의존관계를 pom.xml에 추가하여 저지 버전을 확인하십시오.이 예에서는 Jersey 2 (2.24)를 사용하고 있습니다.

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>2.24</version>
    </dependency>

Gradle에 다음 종속성을 추가합니다.

compile group: 'org.glassfish.jersey.media',
name         : 'jersey-media-moxy',
version      : '2.24.1'

jersey-media-moxy에 의해서도 같은 예외가 발생합니다.@XmlAttribute꼭 필요한 주석@XmlElement제 시나리오에서는 이 문제가 특정 클래스에서만 발생하고 다른 클래스는 정상적으로 동작하는 경우 특히 검토해야 할 사항입니다.

이 의존관계를 추가하면 오류가 수정되었지만 다른 권장 답변은 수정되지 않았습니다.

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-jaxb</artifactId>
    <version>${jersey2.version}</version>
</dependency>

다음과 같은 의존관계가 있을 수 있습니다.

jersey-common-2.25.1.jar
jersey-media-json-jackson-2.25.1.jar

...?

클라이언트 휴식 호출을 실행하는 리치 자바 애플리케이션에 있습니다.이 클라이언트의 실행 가능 jar를 조립하면 모든 의존관계가 하나의 jar 파일로 압축 해제됩니다.두 파일 모두 org.glassfish.jersey라는 파일이 있더군요internal.spi.자동 검색 가능...다른 콘텐츠로!

IDE의 모든 것이 정상적으로 동작하고 있습니다.한 항아리에 한 번 조립하면 필요한 콘텐츠가 다른 항아리에 의해 오버라이드 됩니다.

해결책은 종속성에 대한 몇 가지 제외를 제외하고 순서가 선언된 방식인 것으로 나타났습니다.나는 이것을 리스트의 앞부분에 넣었다.

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.25.1</version>
        <exclusions>
            <exclusion>
                <groupId>org.glassfish.jersey.core</groupId>
                <artifactId>jersey-common</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
            </exclusion>
        </exclusions>
</dependency>

나중에 적어두겠습니다.

 <dependency>   
      <groupId>org.glassfish.jersey.core</groupId>
      <artifactId>jersey-common</artifactId>
      <version>2.25.1</version>
 </dependency>

jersey-common에 대한 다른 의존관계도 다른 의존관계에서 제외했습니다.Fredrik에게 안부 전해 주세요.

언급URL : https://stackoverflow.com/questions/23442440/messagebodyreader-not-found-for-media-type-application-json

반응형