2016-08-11 2 views
0

Ich habe RESTful Web Service geschrieben. Die Technologien, die ich benutze:MessageBodyWriter für benutzerdefinierte Medientypen in Jersey

  • Glassfish 3 (basierend auf Java 6)
  • JDK v7
  • Eclipse-EE Kepler
  • Jersey (Teil von Glassfish)

ich erstellt habe benutzerdefinierte POJO für benutzerdefinierte 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 

Meine Ressource m ethode:

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

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

Meine Nachrichtentext Schriftsteller:

@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()); 
} 

}

Mein Service-Client:

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(); 
    } 
} 

Der Pfad root:

@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; 
} 

}

Wenn ich die Anwendung ausführen ich die folgende Ausgabe von meinem Service-Client erhalten:

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

Ich möchte benutzerdefinierte Medientyp verwenden und MessageBodyWriter, um ein besseres Verständnis von RESTful/Jersey-Service zu haben. Die Fragen, die ich habe:

  • Ist dies der richtige Weg ist Art von Beteiligung/Codierung der benutzerdefinierten Medien?
  • Die Daten, die ich bei Service-Client erhalte, sind nicht vollständig korrekt. Das heißt, anstelle von "/" muss der Wert eine Ziffer 47 sein. Warum bekomme ich also ein Zeichen statt einer Ziffer?
  • Wie Sie bei der Ressourcenmethode gesehen haben, gebe ich zwei Werte zu benutzerdefinierten POJO: Ziffer und String. Bei Service-Client habe ich InputStream. Ich bekomme Byte-Array von Gesamtdaten. Wie kann ich Daten als Teile separater Daten lesen, die als Felder in meinem POJO kodiert sind? Ich könnte byteweise lesen, aber ist das eine korrekte Vorgehensweise?

Antwort

0

Die Lösung, die ich herausgefunden habe, ist einfach. Ich brauchte nur Wrapper-Klasse für InputStream zu verwenden, das heißt,

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

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

Das gleiche Wrapper muss bei MessageBodyWriter Implementierungsklassen angewandt werden. Ich habe die Implementierung für MessageBodyReader (die gleichen Regeln gelten wie oben) für das Lesen von benutzerdefiniertem POJO/MediaType bei der Ressourcenmethode hinzugefügt. Es funktioniert reibungslos.

Verwandte Themen