#jersey-2.0 #open-liberty
#джерси-2.0 #открыть-свобода
Вопрос:
У меня простая настройка с gradle и Open Liberty. Из этого поста в блоге https://openliberty.io/blog/2018/12/14/microprofile21-18004.html в нем говорится
«Open Liberty теперь имеет реактивные расширения для JAX-RS 2.1, так что вы можете использовать провайдеров из Apache CXF и Джерси»
Но я не могу заставить его работать с Джерси
Я пробовал различные конфигурации моего файла build.gradle и server.xml но все еще не могу заставить его работать и обнаруживаю, что документации не хватает.
build.gradle
apply plugin: 'war'
apply plugin: 'liberty'
apply plugin: 'java-library'
group = 'x.y.z'
version = '1.0-SNAPSHOT'
description = "X Y Z"
sourceCompatibility = 1.8
targetCompatibility = 1.8
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'net.wasdev.wlp.gradle.plugins:liberty-gradle-plugin:2.6.3'
}
}
repositories {
mavenCentral()
}
//required for compiling, testing and running the application
dependencies {
implementation group: 'org.glassfish.jersey.core', name: 'jersey-client', version: '2.26'
implementation group: 'org.glassfish.jersey.core', name: 'jersey-common', version: '2.26'
implementation group: 'org.glassfish.jersey.core', name: 'jersey-server', version: '2.26'
providedCompile group:'javax.servlet', name:'javax.servlet-api', version:'3.1.0'
testCompile group:'commons-httpclient', name:'commons-httpclient', version:'3.1'
testCompile group:'junit', name:'junit', version:'4.12'
libertyRuntime group:'io.openliberty', name:'openliberty-runtime', version:'19.0.0.3'
// This dependency is exported to consumers, that is to say found on their compile classpath.
api 'org.apache.commons:commons-math3:3.6.1'
// This dependency is used internally, and not exposed to consumers on their own compile classpath.
implementation 'com.google.guava:guava:27.0.1-jre'
testImplementation 'junit:junit:4.12'
}
//Extra properties for project level
ext {
appName = project.name
testServerHttpPort = 9080
testServerHttpsPort = 9443
warContext = appName
}
liberty {
server {
name = "${appName}Server"
configFile = file("src/main/liberty/config/server.xml")
bootstrapProperties = ['default.http.port': testServerHttpPort,
'default.https.port': testServerHttpsPort,
'app.context.root': warContext]
packageLiberty {
archive = "$buildDir/${appName}.zip"
include = "usr"
}
}
}
war {
archiveName = "${baseName}.${extension}"
}
//unit test configuration
test {
reports.html.destination = file("$buildDir/reports/unit")
reports.junitXml.destination = file("$buildDir/test-results/unit")
exclude '**/it/**'
}
//integration test configuration
task integrationTest(type: Test) {
group 'Verification'
description 'Runs the integration tests.'
reports.html.destination = file("$buildDir/reports/it")
reports.junitXml.destination = file("$buildDir/test-results/it")
include '**/it/**'
exclude '**/unit/**'
systemProperties = ['liberty.test.port': testServerHttpPort, 'war.name': warContext]
}
task openBrowser {
description = 'Open browser to http://localhost:8080/${warContext}'
doLast {
java.awt.Desktop.desktop.browse
"http://localhost:${testServerHttpPort}/${appName}".toURI()
}
}
task openTestReport {
description = 'Open browser to the test report'
doLast {
java.awt.Desktop.desktop.browse file("$buildDir/reports/it/index.html").toURI()
}
}
clean.dependsOn 'libertyStop'
check.dependsOn 'integrationTest'
integrationTest.dependsOn 'libertyStart'
integrationTest.finalizedBy 'libertyStop'
integrationTest.finalizedBy 'openTestReport'
libertyPackage.dependsOn 'libertyStop'
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">
<featureManager>
<!-- <feature>jsp-2.3</feature> -->
<!-- <feature>jaxrs-2.1</feature> -->
<feature>servlet-4.0</feature>
<!--
-->
</featureManager>
<httpEndpoint id="defaultHttpEndpoint"
httpPort="${default.http.port}"
httpsPort="${default.https.port}" />
<applicationManager autoExpand="true"/>
<webApplication contextRoot="${app.context.root}" location="${app.context.root}.war" />
</server>
HelloWorldService
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
@Path("/hello")
public class HelloWorldService {
@GET
@Path("/{param}")
public Response getMsg(@PathParam("param") String msg) {
String output = "Jersey say : " msg;
return Response.status(200).entity(output).build();
}
}
Когда я пытаюсь попасть в конечную точку, я получаю 404
curl localhost:9080/XYZ/hello/jersey
Ошибка 404: java.io.FileNotFoundException: SRVE0190E: файл не найден: /hello/jersey
Любая помощь ВЫСОКО ценится!
Комментарии:
1. Есть ли у вас где-нибудь другой класс с
@ApplicationPath("/rest")
?2. Привет @jimgug какова твоя конечная цель? В упомянутой вами статье говорится об использовании реактивных расширений (и Jersey, и CXF выпустили расширения для RxJava и других реактивных технологий), но, похоже, вы пытаетесь использовать реализацию JAX-RS Джерси в OpenLiberty (а не поставщика реактивных расширений Джерси). Если вы хотите использовать Jersey в качестве JAX-RS impl, то я рекомендую использовать API JAX-RS в дополнение к библиотекам Jersey, которые вы уже используете. Возможно, потребуется добавить web.xml для приложения использовать сервлет Джерси (не уверен, извините).
3. Если вы хотите использовать созданный на Джерси провайдер reactive, то я рекомендую использовать этот пост в блоге и его пример кода в качестве руководства: openliberty.io/blog/2019/04/10/jaxrs-reactive-extensions.html В примере используется поставщик RxJava от CXF, но вам просто нужно поменять поставщиков. Надеюсь, это поможет!