2013-11-30 3 views
0

Я хочу использовать Grails-jaxrs plugin для реализации пользовательского MessageBodyReaderSupport для чтения класса UserDto с клиента.MessageBodyReaderSupport для классов DTO?

Как я могу реализовать UserDtoReader, чтобы получить экземпляр UserDto?

Это мой UserDto класс:

public class UserDto { 
    private String firstName; 
    private String lastName; 

    public UserDto() { 
     firstName = ""; 
     lastName = ""; 
    } 

    public UserDto(String firstName, 
        String lastName) { 

     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 


    @Override 
    public String toString() { 
     String s = " { User "; 
     s += "id=" + id + " "; 
     s += "firstName=" + firstName + " "; 
     s += "lastName=" + lastName + " "; 
     s += " User } "; 
     return s; 
    } 
} 

Это мой UserDtoReader класс:

@Consumes("application/json") 
class UserDtoReader extends MessageBodyReaderSupport<UserDto> { 

    @Override 
    public UserDto readFrom(MultivaluedMap<String, String> httpHeaders, 
      InputStream entityStream) throws IOException, 
      WebApplicationException { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 

ответ

1

Используйте это:

@Consumes("application/json") 
class UserDtoReader extends MessageBodyReaderSupport<UserDto> { 

    @Override 
    public UserDto readFrom(MultivaluedMap<String, String> httpHeaders, 
      InputStream entityStream) throws IOException, 
      WebApplicationException { 
     return new JsonSlurper().parse(new InputStreamReader(entityStream)) 
    } 
} 
1
@Provider 
@Consumes(MediaType.APPLICATION_JSON) 
public final class UserDtoReader implements MessageBodyReader<UserDto> { 

    private static final String UTF_8 = "UTF-8"; 
    private Gson gson; 

    private Gson getGson() { 
     if (gson == null) { 
      final GsonBuilder gsonBuilder = new GsonBuilder(); 
      gson = gsonBuilder.create(); 
     } 
     return gson; 
    } 

    public UserDto readFrom(java.lang.Class<UserDto> type, 
      java.lang.reflect.Type genericType, 
      java.lang.annotation.Annotation[] annotations, MediaType mediaType, 
      MultivaluedMap<java.lang.String, java.lang.String> httpHeaders, 
      java.io.InputStream entityStream) throws IOException { 
     InputStreamReader streamReader = new InputStreamReader(entityStream,UTF_8); 

     try { 
      Type jsonType; 
      if (type.equals(genericType)) 
      jsonType = type; 
      else 
      jsonType = genericType; 

        UserDto userDto = getGson().fromJson(streamReader, jsonType); 
      return userDto; 
     } finally { streamReader.close();} 
    } 

    @Override 
    public boolean isReadable(Class<?> type, Type genericType, 
      java.lang.annotation.Annotation[] annotations, MediaType mediaType) { 
     return true; 
    } 

} 

вы можете скачать Google Gson из here

Конфигурация

Классы ресурсов JAX-RS и подмножество классов поставщиков (MessageBodyReaders и MessageBodyWriters). Эти классы настроены в среде выполнения JAX-RS через расширение класса javax.ws.rs.core.Application.

public class ApplicationConfig extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> resources = new java.util.HashSet<>(); 
     resources.add(UserDtoReader.class); 
     return resources; 
    } 
+0

большой, но я могу это сделать также с: MessageBodyReaderSupport? – confile

+0

На самом деле класс MessageBodyReaderSupport реализует MessageBodyReader, насколько вы придерживаетесь своей реализации проекта, следуйте приведенной выше ссылке, упомянутой в этом сообщении. –

Смежные вопросы