天道酬勤,学无止境

jax-rs

JAX-RS: Custom SecurityContext has unexpected type when injected into resource method

问题 我已经实现了一个ContainerRequestFilter来执行基于 JWT 的身份验证: @Provider @Priority(Priorities.AUTHENTICATION) public class AuthenticationFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException { AuthenticationResult authResult = ... if (authResult.isSuccessful()) { // Client successfully authenticated. // Now update the security context to be the augmented security context that contains information read from the JWT. requestContext.setSecurityContext(new JwtSecurityContect(...)); } else { // Client provided no or an invalid

2022-05-15 02:24:04    分类:技术分享    java   authentication   jersey   authorization   jax-rs

Jax rs client pool

问题 我正在使用 jax-rs 2 客户端 API 设置 REST 客户端。 在 api 文档中它说“客户端是管理客户端通信基础设施的重量级对象。初始化和处置客户端实例可能是一项相当昂贵的操作。因此建议仅构建少量客户端应用程序中的实例。” (https://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Client.html)。 根据这个声明,听起来客户端不是线程安全的,我不应该对所有请求使用单个客户端实例。 我正在使用 CXF 实现,到目前为止我还没有找到为客户端对象设置池的方法。 如果有人有任何信息,请您分享一下。 提前致谢。 回答1 默认情况下,CXF 使用基于 JDK 中的 HttpURLConnection 对象的传输来执行 HTTP 请求。 执行连接池允许持久连接为多个 http 请求重用底层套接字连接。 设置这些系统属性来配置池(默认值) http.keepalive=true http.maxConnections=5 增加 http.maxConnections 的值以设置每个目标同时保持活动的最大空闲连接数。 请在此链接中查看属性 properties.html 的完整列表 在这篇文章中详细解释了它是如何工作的 Java HttpURLConnection 和池化 另请注意,默认情况下,默认 JAX-RS

2022-05-14 14:59:28    分类:技术分享    client   jax-rs   cxf

JAXRS + JerseyTest testing a REST Service

问题 我用四种方法创建了一个 Rest 服务,GET、POST、UPDATE 和 DELETE。 这些方法与数据库建立连接以检索和存储数据。 现在我想测试每种方法。 我为此使用了 Jersey 测试框架。 只要我删除实际调用数据库的代码,它就可以工作。 当我离开调用数据库的代码时,它会抛出一个无法连接到数据库的异常。 编辑:我做了一些研究并使用了依赖注入。 db 调用被移到一个单独的类,但我仍然做错了什么。 数据库结果。 在这个类中调用数据库。 public class DatabaseResults { private final String getQuery = "SELECT * FROM movies"; private Connection connection = null; private PreparedStatement pstmt = null; private final ArrayList<Movie> jsonList = new ArrayList<>(); public JSONObject getAllMovies() throws SQLException { try { ComboPooledDataSource dataSource = DatabaseUtility.getDataSource(); connection =

2022-05-14 11:01:17    分类:技术分享    java   rest   jersey   jax-rs   jersey-test-framework

IncompatibleClassChangeError When Deploying JAX-RS Application to Tomcat

问题 当我在 Tomcat 8 上使用 JDK 8 从 Eclipse 运行我的 Web 项目时,一切都可以完美运行,但是一旦我构建了这个项目并将 WAR 部署到服务器上的 Tomcat 8,我就会收到以下错误: java.lang.IncompatibleClassChangeError: com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider and com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$Wadl disagree on InnerClasses attribute 我已经尝试了一切,但仍然无法正常工作。 这是我的pom.xml文件: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>

2022-05-13 16:09:04    分类:技术分享    rest   maven   jersey   jax-rs   tomcat8

JAX-RS DynamicFilter not being called for sub-resource

问题 根据文档,应该可以将 DynamicFeature 用于资源和子资源。 作为一种效果,我希望在调用子资源端点时注册和调用过滤器 - 即GET /some/sub/x 。 但是以下对我不起作用(也不是其他类似的方法): 注解@NameBinding @Target({METHOD, TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface SomeFilterAnn {} 资源@SomeFilterAnn @Path("/some") public class SomeResource { @GET public String getSome() { return "some"; } @Path("/sub") public SubResource getSub() { return new SubResource(); } @SomeFilterAnn @Path("/x") public static class SubResource { @GET public String getSome() { return "sub"; } } } 过滤器(实际上更复杂,由DynamicFilter配置) @SomeFilterAnn public class SomeFilter implements

2022-05-12 07:38:33    分类:技术分享    java   rest   jax-rs   cxf

Character Encoding in POST JSON Request

问题 我正在向我的应用程序发送一个 POST JSON 请求。 POST /CharSetTest/Test HTTP/1.1 Host: localhost:8090 Content-Type: application/json Cache-Control: no-cache Postman-Token: 1637b92b-5896-4765-63c5-d04ad73ea9f1 { "SampleRequest": { "FullName": "関連当" } } 我的 CXF JAXRS 消费者定义如下。 @POST @Produces("application/json; charset=UTF-8") @Consumes("application/json; charset=UTF-8") public Response testCharSet(@Encoded String jsonBody); 但我作为 POST 请求发送的日文字符(关连当)未编码,并导致一些垃圾字符“ é¢é£å½äºè ” 使用 SoapUI 会导致“??????” 人物。 这个垃圾字符因我点击请求的客户端而异。 我如何编码我的 POST 请求? 回答1 这里没有一个答案对我有用。 我的内容类型已设置为“application/json;charset=UTF-8”,但我的标头中的accept

2022-05-12 06:25:24    分类:技术分享    java   rest   jax-rs   cxf

How to use PATCH method in CXF

问题 我正在尝试使用 JAX-RS 的 CXF 实现在我的客户端中使用 PATCH 方法。 起初我将 PATCH 注释定义为 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @HttpMethod("PATCH") public @interface PATCH { } 参考这里写的:How to have a @PATCH annotation for JAX-RS? 然后我发现@PATCH 已添加到 CXF 3.1.2 中,所以我在我的 maven 的 pom.xml 中更改了版本,并且package org.apache.cxf.jaxrs.ext;中确实有public @interface PATCH ; 并且代码实际上看起来与我上面发布的完全一样。 但是,当我尝试在我的服务定义上使用此注释时 @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public interface AbcService { @PATCH @Path("/abc/efg") public SomeDTO patchSomething(RequestObject request); } 我最终得到java.net

2022-05-11 17:50:05    分类:技术分享    java   rest   jax-rs   cxf   http-patch

Simple JavaEE HTML GET/POST application

问题 我刚刚开始使用 JavaEE(我对 JavaSE 相当流利),并且无法将我的大脑包裹在制作最简单的应用程序所需的所有新事物上。 现在我正在尝试使用 JAX-RS 注释在 IntelliJ 中使用 Glassfish 4 生成一个简单的“Hello World”html 页面。我已经四处寻找这些注释的正确使用方法,看起来我做得正确,但无论我在 localhost 中的哪个位置导航,我都会收到 404。 我开始认为我的代码中缺少重要组件,而且我对 JavaEE 的了解还不够,无法知道我缺少什么(也许它可能是 web xml 文件中的某些东西,我不知道太多关于)。 这是我写的代码,减去导入: @LocalBean @Stateless @Path("/hello") @Produces("text/html") public class Hello { @GET @Path("/world") public String printHelloWorld() { return "<html lang=\"en\"><body><h1>Hello, World!</h1></body></html>"; } } 服务器本身已启动并正在运行,应用程序似乎已正确部署。 启动时设置的默认 URL 是“http://localhost:8080/HelloWorld_war_exploded/

2022-05-11 08:54:18    分类:技术分享    java   jakarta-ee   intellij-idea   glassfish   jax-rs

jackson - MessageBodyWriter Not Found when returning a JSON POJO from a GET Api

问题 我试图使用杰克逊返回一个简单的 json 响应。 @GET @Produces(MediaType.APPLICATION_JSON) public FMSResponseInfo test(){ System.out.println("Entered the function"); FMSResponseInfo fmsResponseInfo = new FMSResponseInfo(); List<SearchDetailsDTO> searchDetailsDtoList = new ArrayList<>(); for (int i = 0; i < 5; i++) { SearchDetailsDTO searchDetailsDto = new SearchDetailsDTO(); searchDetailsDto.setBarcode("barcode" + i); searchDetailsDto.setDocNo("docNo" + i); searchDetailsDto.setDocType("docType" + i); searchDetailsDtoList.add(searchDetailsDto); } fmsResponseInfo.setStatus("200"); fmsResponseInfo.setMessage(

2022-05-11 04:38:03    分类:技术分享    java   json   jersey   jackson   jax-rs

Design Pattern to model Request and Response Objects for Webservices

问题 我有大约 7 个 REST Web 服务要实现。 其中一些 Web 服务具有标准(相同的)响应,而另一些则具有不同的响应。 这些 Web 服务的请求不同,但一些请求和一些响应具有相同的底层数据对象。 我不确定是否必须为每个 Web 服务构建单独的请求/响应类或重用一个标准类。 我想知道是否有设计模式来为这些 Web 服务的请求对象和响应对象建模。 好的,假设 Account 和 Book 是我的 Web 服务将使用的两个剩余资源。 class Account { String username; String id; } class Book { String title; String isbn; } 所以我的网络服务看起来像这样: MYAPI/CreateAccountandBook MYAPI/Account/Create MYAPI/Book/Create MYAPI/Book/Update/{isbn} MYAPI/Account/Update/{id} MYAPI/Account/getInfo/{id} 等等。 现在CreateAccountandBook请求将接受一个帐户对象和有效负载中的书籍列表。 MYAPI/Account/getInfo/{id}的响应对象也有一个帐户对象和与该帐户关联的书籍列表。

2022-05-09 12:17:06    分类:技术分享    java   web-services   rest   design-patterns   jax-rs