Как мне настроить класс POJO, чтобы он мог использоваться в качестве ресурса в службе отдыха JAX-RS?(Liferay 7.1) - PullRequest
0 голосов
/ 13 февраля 2019

Я могу использовать объект String в службе отдыха JAX-RS, но не могу использовать объект POJO.Как мне настроить класс POJO, чтобы он мог использоваться в качестве ресурса в службе отдыха JAX-RS?

Класс DTO

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 + "]";
    }
}

Служба отдыха:

@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 + "'}";
    }
}

Ошибка:

2019-02-12 13: 33: 58.021 ОШИБКА [http-nio-8080-exec-1] [JAXRSUtils: 83] Для класса com не найдено средство чтения тела сообщения.dto.RestServiceDTO, ContentType: application / json

1 Ответ

0 голосов
/ 14 февраля 2019

Liferay использует реализацию JAX-RS Apache CXF.Как упомянуто в комментариях @dkb, вы должны предоставить аннотацию, которая есть у вас в примере кода.

Вам необходимо добавить зависимости.Посмотрите список ниже и обратите внимание, что некоторые из них предоставляются платформой, но некоторые должны быть включены в ваш jar-файл и не забывайте о транзитивных зависимостях.

      <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>

Последнее - это.Вам необходимо зарегистрировать своего провайдера Jackson в приложении JAX-RS.Это делается в классе приложений, например, вот так (есть и другие способы сделать это).

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