2016-08-11 2 views
0

J'ai écrit le service Web RESTful. Les technologies que j'utilise:MessageBodyWriter pour le type de support personnalisé dans Jersey

  • Glassfish 3 (basé sur Java 6)
  • v7
  • JDK
  • Eclipse EE Kepler
  • Jersey (partie de Glassfish)

J'ai créé POJO personnalisé pour MediaType personnalisé:

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 

Ma ressource m ODE:

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

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

Mon corps de message écrivain:

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

}

Mon client de service:

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

Le chemin racine:

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

}

Quand je lance l'application, je reçois la sortie suivante de mon client de service:

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

Je veux utiliser le type de support personnalisé et MessageBodyWriter afin d'avoir une meilleure compréhension des RESTful/services Jersey. Les questions que j'ai:

  • Est-ce la bonne façon d'impliquer/coder le type de support personnalisé?
  • Les données que je reçois au client de service ne sont pas totalement correctes. C'est-à-dire, au lieu de "/", la valeur doit être un chiffre 47. Alors, pourquoi ai-je le caractère à la place du chiffre?
  • Comme vous l'avez vu à la méthode des ressources j'ai entré deux valeurs à POJO personnalisé: chiffre et chaîne. Au client de service j'ai InputStream. Je reçois un tableau d'octets de données globales. Comment puis-je lire des données sous la forme de blocs de données séparées, qui sont encodés en tant que champs dans mon POJO? Je pourrais lire octet par octet, mais est-ce une façon correcte de le faire?

Répondre

0

La solution, que j'ai trouvée, est simple. Je juste besoin d'utiliser la classe wrapper pour InputStream, à savoir,

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

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

Le même emballage doit être appliquée à MessageBodyWriter classe de mise en œuvre. J'ai ajouté l'implémentation pour MessageBodyReader (les mêmes règles s'appliquent que ci-dessus) pour lire POJO/MediaType personnalisé à la méthode de ressource. Cela fonctionne bien.