如何在 payara 5 上用 moxy 替换 jackson
How to replace jackson for moxy on payara 5
我阅读了很多有关如何在 payara 5 上用 moxy 替换 jackson 的内容,但一直没有找到好的解决方案,所以我创建了一个小项目,希望有人能帮助我。
pom.xml
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>${version.javaee}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.27</version>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<type>pom</type>
<version>1.4</version>
</dependency>
<dependencies>
App.java
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.glassfish.jersey.jackson.JacksonFeature;
@ApplicationPath("/api")
public class App extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
resources.add(JacksonFeature.class);
resources.add(SimpleService.class);
return resources;
}
}
SimpleService.java
@Path("sample")
public class SimpleService {
@Path("greet2")
@GET
@Produces(MediaType.APPLICATION_JSON)
public PojoEntity doGreet2() {
PojoEntity pojoEntity = new PojoEntity();
pojoEntity.setTeste1("TesteValue1");
pojoEntity.setTeste2("TesteValue2");
return pojoEntity;
}
}
PojoEntity.java
public class PojoEntity {
private String teste1;
@JsonProperty("differentName")
private String teste2;
//getters and setters
}
将此微应用程序部署到 payara 5 并请求端点后 http://localhost:8080/micro-sample/api/sample/greet2 结果是(如预期):
{"teste1":"TesteValue1","differentName":"TesteValue2"}
Payara 使用 Jackson 而不是 moxy。 :) 不错!!!
============================================= =
我的问题 是当我使用 microprofile 到达我自己的端点时:
SimpleServiceMicroprofileApi.java
import javax.enterprise.context.Dependent;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
@Dependent
@RegisterRestClient
@Produces(MediaType.APPLICATION_JSON)
public interface SimpleServiceMicroprofileApi {
@Path("api/sample/greet2")
@GET
@Produces(MediaType.APPLICATION_JSON)
public PojoEntity recallGreet2();
}
MicroService.java
package fish.payara.micro.sample;
import java.net.MalformedURLException;
import java.net.URL;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.eclipse.microprofile.rest.client.RestClientBuilder;
@Path("micro")
public class MicroService {
@Path("recallGreet2")
@GET
@Produces(MediaType.APPLICATION_JSON)
public PojoEntity recallGreet2() throws MalformedURLException {
PojoEntity pojoEntity = new PojoEntity();
pojoEntity.setTeste1("LOL");
pojoEntity.setTeste2("LOL2");
URL apiUrl = new URL("http://localhost:8080/micro-sample");
SimpleServiceMicroprofileApi playlistSvc = RestClientBuilder.newBuilder().baseUrl(apiUrl)
.build(SimpleServiceMicroprofileApi.class);
return playlistSvc.recallGreet2();
}
}
并在 getClasses 方法的 App.java 上添加此行:
resources.add(MicroService.class);
通过此修改重新部署后,我们可以访问 http://localhost:8080/micro-sample/api/micro/recallGreet2,结果为:
{"teste1":"LOL","differentName":null}
显然 microprofile 继续使用 moxy 并忽略 PojoEntity 属性 "differentName".
有人知道在这个例子中完全用 moxy 代替 jackson 的方法吗?
此项目可用 here 可以测试这种情况。 :)
Payara 版本:5.183
提前致谢。
您只需在 SimpleServiceMicroprofileApi 上注册 JacksonFeature:
@RegisterProvider(JacksonFeature.class)
这应该会起作用;)
我阅读了很多有关如何在 payara 5 上用 moxy 替换 jackson 的内容,但一直没有找到好的解决方案,所以我创建了一个小项目,希望有人能帮助我。
pom.xml
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>${version.javaee}</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.27</version>
</dependency>
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<type>pom</type>
<version>1.4</version>
</dependency>
<dependencies>
App.java
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.glassfish.jersey.jackson.JacksonFeature;
@ApplicationPath("/api")
public class App extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
resources.add(JacksonFeature.class);
resources.add(SimpleService.class);
return resources;
}
}
SimpleService.java
@Path("sample")
public class SimpleService {
@Path("greet2")
@GET
@Produces(MediaType.APPLICATION_JSON)
public PojoEntity doGreet2() {
PojoEntity pojoEntity = new PojoEntity();
pojoEntity.setTeste1("TesteValue1");
pojoEntity.setTeste2("TesteValue2");
return pojoEntity;
}
}
PojoEntity.java
public class PojoEntity {
private String teste1;
@JsonProperty("differentName")
private String teste2;
//getters and setters
}
将此微应用程序部署到 payara 5 并请求端点后 http://localhost:8080/micro-sample/api/sample/greet2 结果是(如预期):
{"teste1":"TesteValue1","differentName":"TesteValue2"}
Payara 使用 Jackson 而不是 moxy。 :) 不错!!!
============================================= =
我的问题 是当我使用 microprofile 到达我自己的端点时:
SimpleServiceMicroprofileApi.java
import javax.enterprise.context.Dependent;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
@Dependent
@RegisterRestClient
@Produces(MediaType.APPLICATION_JSON)
public interface SimpleServiceMicroprofileApi {
@Path("api/sample/greet2")
@GET
@Produces(MediaType.APPLICATION_JSON)
public PojoEntity recallGreet2();
}
MicroService.java
package fish.payara.micro.sample;
import java.net.MalformedURLException;
import java.net.URL;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.eclipse.microprofile.rest.client.RestClientBuilder;
@Path("micro")
public class MicroService {
@Path("recallGreet2")
@GET
@Produces(MediaType.APPLICATION_JSON)
public PojoEntity recallGreet2() throws MalformedURLException {
PojoEntity pojoEntity = new PojoEntity();
pojoEntity.setTeste1("LOL");
pojoEntity.setTeste2("LOL2");
URL apiUrl = new URL("http://localhost:8080/micro-sample");
SimpleServiceMicroprofileApi playlistSvc = RestClientBuilder.newBuilder().baseUrl(apiUrl)
.build(SimpleServiceMicroprofileApi.class);
return playlistSvc.recallGreet2();
}
}
并在 getClasses 方法的 App.java 上添加此行:
resources.add(MicroService.class);
通过此修改重新部署后,我们可以访问 http://localhost:8080/micro-sample/api/micro/recallGreet2,结果为:
{"teste1":"LOL","differentName":null}
显然 microprofile 继续使用 moxy 并忽略 PojoEntity 属性 "differentName".
有人知道在这个例子中完全用 moxy 代替 jackson 的方法吗?
此项目可用 here 可以测试这种情况。 :)
Payara 版本:5.183
提前致谢。
您只需在 SimpleServiceMicroprofileApi 上注册 JacksonFeature:
@RegisterProvider(JacksonFeature.class)
这应该会起作用;)