2017-04-04 140 views
1

我正在使用球衣編寫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) 

回答

1

你只有一個MessageBodyWriter來處理服務器端傳出的序列化,但需要傳入反序列化MessageBodyReader

一旦你實現讀者,然後用Client

restClient.register(MyReader.class); 

作爲註冊它放在一邊,一個共同的模式它必須使供應商類實現既MessageBodyReaderMessageBodyWriter。這樣,你只需要一個班級提供者閱讀和寫作。

+0

謝謝@peeskillet。你是正確的,我是如何驗證它的,我用String類來轉換我的REST響應在PetClient.java運行良好。 String petString = response.readEntity(String.class);我必須在客戶端編寫MessageBodyReader以將響應轉換爲Pet對象。 – PST