복붙노트

[SPRING] Jersey : 미디어 유형 = application / json, type = class에 대해 MessageBodyWriter를 찾을 수 없습니다. org.codehaus.jackson.node.ObjectNode?

SPRING

Jersey : 미디어 유형 = application / json, type = class에 대해 MessageBodyWriter를 찾을 수 없습니다. org.codehaus.jackson.node.ObjectNode?

Jersey 2.8 Client를 사용하여 데이터를 RESTful 엔드 포인트에 게시합니다. 코드는 다음과 같습니다.

    final Client client = ClientBuilder.newClient();
    final WebTarget target = client.target(url).path("inventorySummary");
    final Invocation.Builder builder = target.request().header("Content-Type", MediaType.APPLICATION_JSON);

    final ObjectNode payload = getObjectMapper().createObjectNode();
    payload.put("startDate", DateTime.now().toString());
    payload.put("endDate", DateTime.now().plusDays(30).toString());
    payload.put("networkId", 0);

    final Response response = builder.accept(MediaType.APPLICATION_JSON).post(Entity.entity(payload, MediaType.APPLICATION_JSON));
    assertStatus(Response.Status.OK.getStatusCode(), response);
    final JsonNode jsonReply = parseResponse(response);

getObjectMapper ()는 다음과 같이 보입니다.

public ObjectMapper getObjectMapper() {
        return new ObjectMapper()
                .configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false /* force ISO8601 */)
                .configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true)
                .configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING, true)
                .setSerializationInclusion(JsonSerialize.Inclusion.ALWAYS);
    }

테스트를 실행하려고하면 오류가 발생합니다.

MessageBodyWriter not found for media type=application/json, type=class org.codehaus.jackson.node.ObjectNode, genericType=class org.codehaus.jackson.node.ObjectNode

내가 여기서 무엇을 놓치고 있니?

감사

해결법

  1. ==============================

    1.잭슨 1.x를 사용해도 괜찮다면 다음 3 가지가 필요합니다.

    잭슨 1.x를 사용해도 괜찮다면 다음 3 가지가 필요합니다.

    1. pom.xml에 Jersey Jackson을 추가하십시오.

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

    2. ContextResolver 만들기 :

    @Provider
    public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {
    
        final ObjectMapper defaultObjectMapper;
    
        public ObjectMapperProvider() {
            defaultObjectMapper = getObjectMapper();
        }
    
        @Override
        public ObjectMapper getContext(Class<?> type) {
            return defaultObjectMapper;
        }
    
        public static ObjectMapper getObjectMapper() {
            return new ObjectMapper()
                    .configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false /* force ISO8601 */)
                    .configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true)
                    .configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING, true)
                    .setSerializationInclusion(JsonSerialize.Inclusion.ALWAYS);
        }
    }
    

    3. Provider를 ClientBuilder에 등록합니다.

    final Client client = ClientBuilder.newBuilder()
            .register(ObjectMapperProvider.class)
            .register(JacksonFeature.class)
            .build();
    
    final WebTarget target = client.target(url).path("inventorySummary");
    
    final ObjectNode payload = ObjectMapperProvider.getObjectMapper().createObjectNode();
    payload.put("startDate", DateTime.now().toString());
    payload.put("endDate", DateTime.now().plusDays(30).toString());
    payload.put("networkId", 0);
    
    final Response response = target.request(MediaType.APPLICATION_JSON)
                                    .post(Entity.json(payload));
    
    assertStatus(Response.Status.OK.getStatusCode(), response);
    
  2. ==============================

    2.나는 X가 추가되었다는 것을 설명하는 덧글을 덧붙였다.

    나는 X가 추가되었다는 것을 설명하는 덧글을 덧붙였다.

    그러나, pom.xml에 다음과 같은 maven 의존성을 추가하는 것은 잘 작동하며,보다 표준적인 수정처럼 보입니다.

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

    참고 : org.glassfish.jersey.archetypes / jersey-quickstart-grizzly maven 아키타 입은 기본적으로 위의 종속성을 추가하지만 "JSON 지원을 얻으려면 주석 처리 해제"주석으로 주석 처리됩니다.

  3. ==============================

    3.PHP를 실행하는 Apache 서버에서 응답을 얻으려고 할 때도 동일한 문제가있었습니다. 내 응답은 서버에서 좋았지 만 Spring은 application / json 유형에 대해 MessageBodyWriter를 찾을 수 없다는 불만을 제기했습니다. 내 pom.xml에 Genson 종속성을 추가하고 해결했습니다!

    PHP를 실행하는 Apache 서버에서 응답을 얻으려고 할 때도 동일한 문제가있었습니다. 내 응답은 서버에서 좋았지 만 Spring은 application / json 유형에 대해 MessageBodyWriter를 찾을 수 없다는 불만을 제기했습니다. 내 pom.xml에 Genson 종속성을 추가하고 해결했습니다!

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

    설명서는 https://code.google.com/p/genson/에서 찾을 수 있습니다.

  4. ==============================

    4.ObjectNode를 String으로 쓰려고 시도하십시오.

    ObjectNode를 String으로 쓰려고 시도하십시오.

    // your code
    final ObjectNode payload = getObjectMapper().createObjectNode();
    payload.put("startDate", DateTime.now().toString());
    payload.put("endDate", DateTime.now().plusDays(30).toString());
    payload.put("networkId", 0);
    
    // the solution
    String entity = getObjectMapper().writeValueAsString(payload);
    
    final Response response = builder.accept(MediaType.APPLICATION_JSON).post(Entity.entity(entity, MediaType.APPLICATION_JSON));
    
  5. from https://stackoverflow.com/questions/23601842/jersey-messagebodywriter-not-found-for-media-type-application-json-type-class by cc-by-sa and MIT license