2016-08-11 2 views
0

Я писал веб-службу RESTful. Технологии, которые я использую:MessageBodyWriter для пользовательских медиа-типов в Джерси

  • Glassfish 3 (на основе Java 6)
  • JDK v7
  • Затмения EE Kepler
  • Джерси (часть Glassfish)

я создал пользовательский POJO для пользовательских MediaType:

public final class SimpleEntity{ 

private int value = 0; 
private String stValue = ""; 

public SimpleEntity(){} 

public SimpleEntity(int value, String stValue) { 
    super(); 
    this.value = value; 
    this.stValue = stValue; 
} 
... getters, setters 

Мой ресурс m еню:

@POST 
@Produces("application/entity") 
@Path("/getSimpleEntityNeedsProvider") 
public Response getSimpleEntityNeedsProvider(){ 
    SimpleEntity entity = new SimpleEntity(47, "String input value"); 

    return Response.ok().entity(entity).build(); 
} 

Мое тело сообщение Автор:

@Provider 
@Produces("application/entity") 
public final class SimpleEntityBodyWriterProvider implements MessageBodyWriter<SimpleEntity>{ 

    private static Logger log = Logger.getLogger(Class.class); 

    @Override 
public long getSize(SimpleEntity arg0, Class arg1, Type arg2, Annotation[] arg3, 
     MediaType arg4) { 

    return -1; 
} 

@Override 
public boolean isWriteable(Class arg0, Type arg1, Annotation[] arg2, 
     MediaType arg3) { 
    if(arg0.equals(SimpleEntity.class)){    
     return true; 
    } 
    return false; 
} 

@Override 
public void writeTo(SimpleEntity entity, Class arg1, Type arg2, Annotation[] arg3, 
     MediaType media, MultivaluedMap arg5, OutputStream out) 
     throws IOException, WebApplicationException { 

    log.log(Level.INFO, "Input to SimpleEntityBodyWriterProvider: "+entity.getValue()); 

    out.write(entity.getValue()); 
    out.write(entity.getStValue().getBytes()); 
} 

}

Мой клиент службы:

private void getSimpleEntityNeedsProvider(String strUrl, String method){ 
    HttpURLConnection connect = null; 
    try { 
     URL url = new URL(strUrl); 
     connect = (HttpURLConnection)url.openConnection(); 

     connect.setRequestProperty("Accept", "application/entity");// Accept from server 
     connect.setRequestMethod(method); 
     connect.connect(); 

     InputStream input = connect.getInputStream(); 

     int size = input.available(); 
     byte[] b = new byte[size]; 
     input.read(b, 0, size); 

     System.out.println("From resource: "+new String(b)); 

     System.out.println("Status: "+connect.getResponseCode()+" : "+connect.getResponseMessage()); 

    } 
    catch(IOException e){ 
     e.printStackTrace(); 
    } 
} 

Корневой путь:

@ApplicationPath("/rest/v6") 
public class AppV6 extends Application { 
    private static Logger log = Logger.getLogger(Class.class.getName()); 
    public AppV6(){} 

    @Override 


public Set<Class<?>> getClasses(){ 
     Set<Class<?>> cls = new HashSet<>(); 
    cls.add(SimpleEntity.class); 
    cls.add(SimpleEntityBodyWriterProvider.class); 

    return cls; 
} 

}

При запуске приложения я получаю следующий вывод из моего клиента службы:

From resource: /String input value 
Status: 200 : OK 

Я хочу использовать пользовательский тип носителя и MessageBodyWriter для того, чтобы иметь более глубокое понимание RESTful/услуги Джерси. Вопросы, которые у меня есть:

  • Это правильный способ вовлечения/кодирования пользовательского типа мультимедиа?
  • Данные, которые я получаю при обслуживании клиента, не совсем корректны. I.e, вместо «/» значение должно быть цифрой 47. Итак, почему я получаю символ вместо цифры?
  • Как вы видели в методе ресурсов, я ввожу два значения в пользовательские POJO: digit и string. У сервисного клиента у меня есть InputStream. Я получаю массив байтов общих данных. Как читать данные как фрагменты отдельных данных, которые закодированы как поля в моем POJO? Я мог бы читать байт по байт, но это правильный способ сделать это?

ответ

0

Решение, которое я выяснил, прост. мне просто нужно использовать класс-оболочку для InputStream, т.е.

InputStream data = connect.getInputStream(); 
     DataInputStream input = new DataInputStream(data); 

     System.out.println("From resource: "+input.readInt()+" : "+input.readUTF()); 

То же обертка должна применяться в MessageBodyWriter класса реализации. Я добавил реализацию для MessageBodyReader (те же правила применяются, как указано выше) для чтения пользовательского метода POJO/MediaType по методу ресурсов. Он работает плавно.

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