首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javax.ws.rs.core.Response.readEntity(Pet.class)导致异常MessageBodyProviderNotFoundException

javax.ws.rs.core.Response.readEntity(Pet.class)导致异常MessageBodyProviderNotFoundException
EN

Stack Overflow用户
提问于 2017-04-04 06:56:21
回答 1查看 6K关注 0票数 1

我正在用球衣写一个REST客户端。我的REST使用自定义消息体编写器。我得到了正确的输出使用邮递员,但当我试图写一个客户端,我得到一个例外。

代码语言:javascript
复制
@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客户端代码:

代码语言:javascript
复制
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);
  }
}

例外情况:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-04 07:27:02

您只有一个MessageBodyWriter来处理服务器端的传出序列化,但是传入反序列化需要一个MessageBodyReader

一旦实现了读取器,然后将其注册到Client

代码语言:javascript
复制
restClient.register(MyReader.class);

另外,它必须使提供者类实现MessageBodyReaderMessageBodyWriter。这样,您就只有一个类提供程序来进行读写。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43200290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档