1
votes

Comment dois-je configurer une classe POJO pour lui permettre d'être utilisée comme ressource dans le service de repos JAX-RS? (Liferay 7.1)

Je peux utiliser l'objet String dans le service de repos JAX-RS mais je ne peux pas utiliser l'objet POJO. Comment dois-je configurer une classe POJO pour lui permettre d'être utilisée comme ressource dans le service de repos JAX-RS?

Classe DTO

@Component(
    immediate = true,
    property = {
        JaxrsWhiteboardConstants.JAX_RS_APPLICATION_BASE + "=/greetings",
    },
    service = Application.class
)
public class RestServiceApplication extends Application {
    public Set<Object> getSingletons() {
        return Collections.<Object>singleton(this);
    }
    @POST
    @Path("/post")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public String test(RestServiceDTO dto) {
        String groupid = dto.getGroupId();
        return "{'groupid':'" + groupid + "'}";
    }
}

Service de repos:

public class RestServiceDTO {
    private String groupId;
    public String getGroupId() {
        return groupId;
    }
    public void setGroupId(String groupId) 
        this.groupId = groupId;
    }
    @Override
    public String toString() {
        return "RestServiceDTO [groupId=" + groupId + "]";
    }
}

Erreur:

2019-02-12 13: 33: 58.021 ERREUR [http-nio-8080-exec-1] [JAXRSUtils: 83] Non Un lecteur de corps de message a été trouvé pour la classe com.dto.RestServiceDTO, ContentType: application / json


5 commentaires

utilisez-vous l'implémentation Jersey de JAX-RS?


Réf: journaldev.com/498/jersey-java-tutorial


J'utilise javax.ws.rs de liferay 7.1


voir: mkyong.com/webservices/jax-rs / json-example-with-jersey-jacks‌ sur


1. Ajoutez jersey-json comme dépendance 2. Intégrez JSON avec Jersey 3.Annotez la méthode avec @Produces (MediaType.APPLICATION_JSON). Jersey utilisera Jackson pour gérer automatiquement la conversion JSON.


3 Réponses :


0
votes

Liferay utilise l'implémentation Apache CXF de JAX-RS. Comme @dkb l'a mentionné dans les commentaires, vous devez fournir l'annotation que vous avez dans l'exemple de code.

Vous devez ajouter les dépendances. Consultez la liste ci-dessous et notez que certains sont fournis par la plateforme mais que certains doivent être inclus dans votre fichier jar et n'oubliez pas les dépendances transitives.

@Override
public Set<Object> getSingletons() {
    Set<Object> singletons = new HashSet<>();
    singletons.add(getJacksonProvider());
    return Collections.unmodifiableSet(singletons);
}

La dernière chose est . Vous devez enregistrer votre fournisseur Jackson dans l'application JAX-RS. Cela se fait dans la classe applicaiton par exemple comme ceci (il y a plus de manières de le faire).

      <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-core</artifactId>
            <version>3.0.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
            <version>3.0.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-rs-extension-providers</artifactId>
            <version>3.0.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
            <version>2.7.9</version>
        </dependency>


1 commentaires

Merci beaucoup, @Miroslav Ligas pouvez-vous expliquer en détail comment enregistrer le fournisseur Jackson dans l'application JAX-RS?



0
votes

Ajouter une dépendance pour MAVEN

return Response.ok(JSONFactoryUtil.looseSerializeDeep("{'groupid':'" + groupid + "'}"), MediaType.APPLICATION_JSON).build();

pour GRADLE

@Override
public Set<Object> getSingletons() {

    Set<Object> singletons = new HashSet<>();

    singletons.add(this);

    singletons.add(getJacksonJsonProvider());

    return Collections.unmodifiableSet(singletons);
}

maintenant ajoutez cette méthode dans votre classe Apllication

private JacksonJsonProvider getJacksonJsonProvider() {

    JacksonJsonProvider jacksonJsonProvider = new JacksonJsonProvider();

    ObjectMapper objectMapper = new ObjectMapper();

    // Prevent serialization of null and empty string values
    objectMapper.setSerializationInclusion(Include.NON_EMPTY);

    jacksonJsonProvider.setMapper(objectMapper);
    jacksonJsonProvider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    return jacksonJsonProvider;
}

changez maintenant le code de la méthode getSingletons () de votre classe Application en

compileOnly group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: '2.9.10'


0 commentaires

2
votes

Depuis la version 7.1, Liferay prend en charge la spécification OSGi JAX-RS Whiteboard, ce qui signifie la prise en charge de JAX-RS 2.1 à l'aide de CXF, ce qui signifie également qu'il existe un support pour les POJO annotés JAXB.

Si vous avez besoin de renvoyer un simple POJO, vous seriez normalement d'accord simplement en annotant votre classe POJO avec @XmlRootElement .

Assurez-vous que le support d'exécution JAXB est attaché à votre application en l'exigeant sur la configuration de votre composant d'application en mettant la propriété osgi.jaxrs.extension.select = (osgi.jaxrs.name = jaxb-json) sur votre composant applicatif.

Cette propriété indique au tableau blanc JAX-RS de ne pas démarrer votre application tant que l'extension n'est pas présente et prête pour votre application.

Depuis Liferay 7.2, l'implémentation par défaut de JAXB a été changée en Jackson. Aucune modification de configuration n'est nécessaire, mais désormais chaque POJO peut être sérialisé en JSON même si le POJO n'est pas annoté. Assurez-vous simplement que le support d'exécution jaxb est attaché à votre application de la même manière que ci-dessus.

Dans les versions 7.1 et 7.2, vous pouvez vérifier l'état de vos applications JAX-RS et des extensions associées, à l'aide de la commande gogo shell jaxrs:check


0 commentaires