[SPRING] Jersey : 미디어 유형 = application / json, type = class에 대해 MessageBodyWriter를 찾을 수 없습니다. org.codehaus.jackson.node.ObjectNode?
SPRINGJersey : 미디어 유형 = 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.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.나는 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.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.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));
from https://stackoverflow.com/questions/23601842/jersey-messagebodywriter-not-found-for-media-type-application-json-type-class by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 JPA 공급 업체 어댑터를 사용하여 최대 절전 모드에서 SQL을 표시하지 못하게 함 (0) | 2019.02.13 |
---|---|
[SPRING] @Transactional rollbackFor를 지정하면 RuntimeException도 포함됩니까? (0) | 2019.02.13 |
[SPRING] 봄 부팅 단일 페이지 응용 프로그램 - index.html에 대한 모든 요청 전달 (0) | 2019.02.13 |
[SPRING] Spring Batch Framework - 배치 테이블 자동 생성 (0) | 2019.02.13 |
[SPRING] 필수 MultipartFile 매개 변수 'file'이 (가) spring mvc에 없습니다. (0) | 2019.02.13 |