2017-08-14 4 views
1

Je construis un prototype de xapi LRS et utiliser Java/Jersey pour créer un test mise en œuvre de service xapi REST, dernière version Jersey est en utilisant Moxy pour XML et le traitement JSON.Jersey Moxy acceptent seule valeur JSON et tableau pour la même ressource

Maintenant, je suis face à la question, selon la spécification des « énoncés » pour trouver le POST peut accepter une seule instruction JSON ou une liste des déclarations.

Je ne peux pas gérer cela, à cause du manque de ma connaissance de Moxy. J'ai essayé différentes approches et je n'ai pas trouvé de solution.

Je trouve la question similair here datée 2014, malheureusement, il n'a pas répondu à ce jour ...

Quelqu'un peut-il proposer une solution que je voudrais garder l'utilisation Moxy?

Répondre

0

J'ai réussi une solution de contournement via ReaderInterceptor

@ArrayWrapper 
public class ArrayWrapperInterceptor implements ReaderInterceptor { 
    public ArrayWrapperInterceptor() { 
     openingCurlyBrace = Pattern.compile("\\A\\s*\\{"); 
     closingCurlyBrace = Pattern.compile("\\}\\s*\\Z"); 
    } 
    @Override 
    public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException { 
     InputStream is = context.getInputStream(); 
     String content = ""; 
     while (is.available() != 0) { 
      byte[] bytes = new byte[is.available()]; 
      is.read(bytes); 
      content = content + new String(bytes); 
     } 
     if (content.length() > 0 && openingCurlyBrace.matcher(content).find() && closingCurlyBrace.matcher(content).find()) { 
      content = "[" + content + "]"; 
     } 
     context.setInputStream(new ByteArrayInputStream(content.getBytes()));  
     return context.proceed(); 
    } 
    private Pattern openingCurlyBrace; 
    private Pattern closingCurlyBrace; 
} 

je définissais cette annotation

@NameBinding 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ArrayWrapper {} 

et le mettre dans les deux endroits (à intercepteur et à mon poste méthode de ressource).

Pour que l'intercepteur ne fonctionne qu'avec l'annotation @ArrayWrapper, j'ai ajouté register (ArrayWrapperInterceptor.class) à ma classe d'application. Sans le Jersey ne le sait pas et avec l'annotation @Provider mon intercepteur est global.

Peut-être pas la meilleure solution, mais maintenant il semble que ce soit la seule solution disponible pour moi. Plus tard, je vais essayer d'étudier la possibilité d'utiliser un objet dynamique dans ma méthode de ressources (comme JSON objet) au lieu de l'utilisation d'intercepteur.