标签: jax-rs

REST API 单个请求 - 多个响应

我正在 JAX-RS 2.0、JDK 8 中编写 REST API 以满足以下要求

POST API /server/fileUpload/(多部分表单数据),我需要在此发送一个大.AI(Adobe Illustrator)文件。

服务器获取文件并返回状态 202(已接受),确认文件传输成功。(从端点到服务器)

现在在服务器上,我使用 Java + Imagemagik 将 .AI 文件(20-25 MB 文件)转换为小 JPG 缩略图,放置在 Apache HTTP 服务器上并共享位置(例如http://happyplace/thumbnail0987.jpg

现在,第二个响应应来自服务器,状态为 200 OK 且缩略图 URL

使用一个 REST API 可行吗?(异步/类似)

或者我应该将其拆分为 2 个 API 调用,请提出建议

java rest jax-rs imagemagick

5
推荐指数
1
解决办法
2万
查看次数

Java JAX-RS CORS/Tomcat 冲突:javax.servlet.ServletException

我目前正在运行我自己的网络应用程序,它通常不会给我设置环境带来任何问题。然而,这是一台安装了 Tomcat 9.0 和 JDK 8 的新机器。这台机器与其他正常工作的机器之间的唯一区别是 Eclipse IDE 的版本。

在此环境中,所有资源都会返回 404,我已将运行时的原因缩小为:

javax.servlet.ServletException:当 allowedOrigins=[*] 时,不允许配置supportsCredentials=[true]

有人知道为什么不再允许这样做/为什么它不起作用?

在 src/main/webapp/WEB-INF/web.xml 中添加 CORS 过滤器,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!-- This web.xml file is not required when using Servlet 3.0 container,
     see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html -->
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>lksecure.lks,lksecure,messenger.msg</param-value>             
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi`/`*</url-pattern>
    </servlet-mapping>

  <filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
      <param-name>cors.allowed.origins</param-name>
      <param-value>*</param-value>
    </init-param>
    <init-param>
      <param-name>cors.allowed.methods</param-name>
      <param-value>GET,POST,DELETE,HEAD,OPTIONS</param-value>
    </init-param>
    <init-param>
      <param-name>cors.allowed.headers</param-name>
      <param-value>Content-Type,auth,user,persona,target,recaptcha,id,endpoint,portX-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
    </init-param>
    <init-param> …
Run Code Online (Sandbox Code Playgroud)

java tomcat jax-rs cors

5
推荐指数
1
解决办法
6746
查看次数

具有 CompletableFuture 的非阻塞异步 Jersey JAX-RS

我正在研究 Jersey,我在一本书中看到您可以使用 CompletableFuture (和 CompletitionStage)以非阻塞 IO 方式调用您的 API。

但是当我用Postman调用API时,我总是得到500。

如果我调试代码,我会发现这些方法被正确调用。

第一个 GET 方法是同步的并且可以正确工作。第二次和第三次返回错误500

我缺少什么?

@Path("/hello")
public class HelloController {

  @GET
  @Path("/first")
  @Produces(MediaType.TEXT_PLAIN)
  public String first() {
    return "It works";
  }

  @GET
  @Path("/second")
  @Produces(MediaType.TEXT_PLAIN)
  public CompletionStage<Response> second() {
    return CompletableFuture.supplyAsync(() -> Response.accepted().entity("Hello!").build());
  }

  @GET
  @Path("/third")
  @Produces(MediaType.TEXT_PLAIN)
  public CompletableFuture<Response> third() {
    return CompletableFuture.supplyAsync(() -> Response.accepted().entity("Hello!").build());
  }
}
Run Code Online (Sandbox Code Playgroud)

java asynchronous jax-rs jersey completable-future

5
推荐指数
1
解决办法
3061
查看次数

swagger ApiResponse 示例

我正在尝试使用 json 正文的示例来记录 api 错误响应。我找不到示例或合适的注释。使用 swagger 编辑器,我至少可以获得一些看起来像我想要实现的结果的东西。

responses:
    '200' :
      description: Request completed with no errors
      examples:   
        application/json:  {"result" : { "id": "blue" }}
Run Code Online (Sandbox Code Playgroud)

库是 swagger-core 1.6.0

 <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-core</artifactId>
            <scope>compile</scope>
            <version>1.6.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

端点是使用 jax-rs 创建的。

我对端点做了这个

@ApiResponses(value = {
    @ApiResponse(code = 200, message = "OK",
            examples = @Example(value = @ExampleProperty(mediaType = "application/json", value = "{\"result\" : { \"id\": \"blue\" }}"))
    )
})
public Response getResult(){}   


Run Code Online (Sandbox Code Playgroud)

生成的 swagger.json 没有所需的

examples:   
 application/json:  {"result" : { "id": "blue" }}         
Run Code Online (Sandbox Code Playgroud)

我也尝试传递response = ApiResponse.class、Examples.class和Example.class,但它没有改变。 …

jax-rs swagger swagger-2.0 swagger-editor swagger-codegen

5
推荐指数
0
解决办法
7261
查看次数

如何在 Quarkus 中处理大文件上传

我的问题有两个:

  1. 我正在寻找一种在 quarkus 应用程序服务器上实现分段文件上传的方法,该服务器允许程序员访问上传的文件。浏览文档似乎有https://quarkus.io/guides/rest-client-multipart,但这并没有告诉我文件存储在服务器上的位置(如果有的话)。

  2. 我也想知道幕后发生了什么。对于大文件(>100MB),内存占用会是什么样子?

jax-rs quarkus

5
推荐指数
2
解决办法
1万
查看次数

REST-Endpoint:异步执行,无返回值

我的问题可能很容易解决,但目前我不明白。在我的 Quarkus-App 中,我有一个 REST-Endpoint,它应该调用一个方法,不等待结果并立即返回 202-HTTP-Statuscode。

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response calculateAsync(String input) {
    process();
    return Response.accepted().build();
}
Run Code Online (Sandbox Code Playgroud)

我已阅读有关 Vert.x 和异步处理的 Quarkus 文档。但要点是:处理是异步完成的,但客户端等待结果。我的客户不需要等待,因为没有返回值。这类似于批处理的调用。

所以我需要类似 a 的东西new Thread,但具有所有 Quarkus-Context。

asynchronous jax-rs quarkus

5
推荐指数
1
解决办法
2062
查看次数

无法再从 HttpServletRequest SpringBoot 2.2、Jersey 2.29 获取表单数据

我们有一个 SpringBoot 应用程序,并使用 Jersey 来审核传入的 HTTP 请求。

我们实现了 Jersey ContainerRequestFilter来检索传入的HttpServletRequest 并使用 HttpServletRequest 的getParameterMap()方法来提取查询和表单数据并将其放入我们的审核中。

这与 getParameterMap() 的 javadoc 一致:

“请求参数是随请求发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发布的表单数据中。”

这是与过滤器相关的文档:

https://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/user-guide.html#filters-and-interceptors

更新SpringBoot后,我们发现getParameterMap()不再返回表单数据,但仍然返回查询数据。

我们发现 SpringBoot 2.1 是支持我们代码的最后一个版本。在 SpringBoot 2.2 中,Jersey 的版本更新为 2.29,但在查看发行说明后,我们没有看到任何与此相关的内容。

发生了什么变化?我们需要改变什么来支持 SpringBoot 2.2 / Jersey 2.29?

这是我们代码的简化版本:

JerseyRequestFilter - 我们的过滤器

import javax.annotation.Priority;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Priorities;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
...

@Provider
@Priority(Priorities.AUTHORIZATION)
public class JerseyRequestFilter implements ContainerRequestFilter {

    @Context
    private ResourceInfo resourceInfo;

    @Context
    private …
Run Code Online (Sandbox Code Playgroud)

jax-rs jersey jersey-2.0 spring-boot spring-jersey

5
推荐指数
2
解决办法
1791
查看次数

OpenAPI 生成器 jaxrs-spec 停止缩短我的枚举值

鉴于项目sizeRange模型领域的OpenAPI 规范:

size:
  type: string
  description: Size range for this project
  enum: [RANGE_0_10M,RANGE_10M_50M,RANGE_50M_100M]
  example: RANGE_10M_50M
Run Code Online (Sandbox Code Playgroud)

OpenAPIjaxrs-spec生成器生成一个Project.class,如下所示:

public enum SizeEnum {
_0_10M(String.valueOf("RANGE_0_10M")), _10M_50M(String.valueOf("RANGE_10M_50M")), _50M_100M(String.valueOf("RANGE_50M_100M"));
Run Code Online (Sandbox Code Playgroud)

生成的枚举值被缩短(用于 Java):

Project.SizeEnum._0_10M
Run Code Online (Sandbox Code Playgroud)

我准备忽略这种不便,但在这种情况下会导致异常:

Enum.valueOf(Project.SizeEnum.class, "RANGE_0_10M");

No enum constant com.mycompany.my_project.Project.SizeEnum.RANGE_0_10M
Run Code Online (Sandbox Code Playgroud)

笔记

如果我将一个以除此之外的内容开头的值添加到枚举中,RANGE_则会导致所有枚举值正确显示。我推断某些进程会自动缩短所有进程,因为它们共享一个前缀。

这是我可以访问的 OpenAPI 生成器配置吗?我找不到它:

java enums jax-rs openapi openapi-generator

5
推荐指数
1
解决办法
1056
查看次数

java.lang.LinkageError:ClassCastException:尝试强制转换jar

我正在编写 JAX-RS API。

当尝试运行以下单元测试时:

    @Test
    public void verifyUserTest() throws InvalidTokenException, InvalidUserException {
        Mockito.when(service.verifyLogin(Mockito.any(LoginRequestDTO.class))).thenReturn(true);
        Mockito.when(service.createToken(Mockito.any(String.class))).thenReturn("testToken");



        var res = sut.verifyUser(new LoginRequestDTO("testuser", "testpass"));
        var entity = res.getEntity();
        System.out.println(entity);

       // Assertions.assertEquals("testuser", res.getUsername());
      //  Assertions.assertEquals("testToken", res.getToken());

    }

Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

java.lang.LinkageError: ClassCastException: attempting to castjar:file:/C:/Users/User/.m2/repository/javax/javaee-web-api/8.0.1/javaee-web-api-8.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class to jar:file:/C:/Users/User/.m2/repository/javax/javaee-web-api/8.0.1/javaee-web-api-8.0.1.jar!/javax/ws/rs/ext/RuntimeDelegate.class

(对我来说)这看起来就像同一个类被加载了两次。我该如何解决这个问题?谢谢。

java junit jax-rs jersey

5
推荐指数
1
解决办法
7840
查看次数

如何使用输入流实体而不是分块编码创建内容长度响应?

我需要从 Jersey 资源传输响应,但我不希望 http 响应使用Transfer-Encoding: chunked. 我提前知道流的长度,因此不需要分块编码。

    @GET
    @Path("/contentLength")
    public Response contentLength() {
        return Response.ok()
                .header("Content-Length", 10_000)
                .entity(RandomInputStream.generateBytes(10_000))
                .build());
    }
Run Code Online (Sandbox Code Playgroud)

即使我设置了 Content-Length,测试也显示响应使用分块传输编码

    @Test
    void contentLength() throws Exception {
        Response response = target().path("/contentLength").request().get();
        assertThat(response.getHeaderString("Transfer-Encoding"), Matchers.nullValue());
        assertThat(response.getHeaderString("Content-Length"), is("10000"));
    }
Run Code Online (Sandbox Code Playgroud)
Expected: null
     but: was "chunked"
Run Code Online (Sandbox Code Playgroud)

有类似的问题,但答案是错误的或需要缓冲响应,这对于大型响应来说是不可行的。对于大型响应,http 不需要分块编码,仅当响应启动时总长度未知时才需要分块编码。

jax-rs jersey jersey-2.0

5
推荐指数
0
解决办法
117
查看次数