【问题标题】:MessageBodyReaderSupport for DTO Classes?MessageBodyReader 是否支持 DTO 类?
【发布时间】:2013-11-30 14:56:14
【问题描述】:

我想使用Grails-jaxrs plugin 来实现自定义MessageBodyReaderSupport 以从客户端读取UserDto 类。

我必须如何实现 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;
    }
}

【问题讨论】:

    标签: java spring-mvc grails groovy jax-rs


    【解决方案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))
        }
    }
    

    【讨论】:

      【解决方案2】:
      @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;
          }
      
      }
      

      你可以从here下载谷歌Gson

      配置

      JAX-RS 资源类和提供程序类的子集(MessageBodyReaders 和 MessageBodyWriters)。这些类通过 javax.ws.rs.core.Application 类的扩展在 JAX-RS 运行时中配置。

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

      【讨论】:

      • 很好,但我也可以使用:MessageBodyReaderSupport?
      • 实际上 MessageBodyReaderSupport 类实现了 MessageBodyReader,这取决于你如何保持你的设计实现,点击你在这篇文章中提到的上面的链接
      猜你喜欢
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2012-10-04
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多