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?