javax.ws.rs.core.Response.readEntity(Pet.class)导致异常MessageBodyProviderNotFoundException
问题描述:
我正在使用球衣编写REST客户端。 我的REST API使用自定义邮件正文编写器。我使用POSTMAN获得正确的输出,但是当我尝试写入客户端时,出现异常。javax.ws.rs.core.Response.readEntity(Pet.class)导致异常MessageBodyProviderNotFoundException
@ApplicationPath("webapi")
public class MyApplication extends Application {
}
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("pet")
public class PetResource {
@GET
@Path("/{breed}/{name}")
@Produces(MediaType.TEXT_PLAIN)
public Pet getPet(@PathParam("breed") String breed, @PathParam("name") String name) {
return new Pet(breed, name);
}
}
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
@Provider
@Produces(MediaType.TEXT_PLAIN)
public class CustomMessageBodyWriter implements MessageBodyWriter<Pet> {
@Override
public long getSize(Pet arg0, Class<?> arg1, Type arg2, Annotation[] arg3,
MediaType arg4) {
return -1;
}
@Override
public boolean isWriteable(Class<?> type, Type arg1, Annotation[] arg2,
MediaType arg3) {
return Pet.class.isAssignableFrom(type);
}
@Override
public void writeTo(Pet pet, Class<?> type, Type arg2, Annotation[] arg3,
MediaType arg4, MultivaluedMap<String, Object> arg5,
OutputStream out) throws IOException, WebApplicationException {
out.write(pet.toString().getBytes());
}
}
public class Pet {
private String name;
private String breed;
public Pet() {
}
public Pet(String breed, String name) {
this.name = name;
this.breed = breed;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
@Override
public String toString() {
return "Pet [name=" + name + ", breed=" + breed + "]";
}
}
REST客户端代码:
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class PetClient {
public static void main(String[] args) {
Client restClient = ClientBuilder.newClient();
Response response = restClient.target("http://localhost:8085/bootstrapexample/webapi/pet/dog/rani").request(MediaType.TEXT_PLAIN).get();
Pet pet = response.readEntity(Pet.class);
System.out.println(pet);
}
}
例外:
Exception in thread "main" org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=text/plain, type=class com.example.bootstrapexample.Pet, genericType=class com.example.bootstrapexample.Pet.
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:231)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1075)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:853)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:785)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:326)
at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:111)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:419)
at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:108)
at com.example.bootstrapexample.PetClient.main(PetClient.java:12)
答
你只有一个MessageBodyWriter
来处理服务器端传出的序列化,但需要传入反序列化MessageBodyReader
。
一旦你实现读者,然后用Client
restClient.register(MyReader.class);
作为注册它放在一边,一个共同的模式它必须使供应商类实现既MessageBodyReader
和MessageBodyWriter
。这样,你只需要一个班级提供者阅读和写作。
谢谢@peeskillet。你是正确的,我是如何验证它的,我用String类来转换我的REST响应在PetClient.java运行良好。 String petString = response.readEntity(String.class);我必须在客户端编写MessageBodyReader以将响应转换为Pet对象。 – PST