cuốn sách gpt4 ai đã làm

Jersey inputStream được sửa đổi trong bộ lọc. Không thể tìm ra cách truy cập inputStream đã sửa đổi trong Tài nguyên Jersey

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 03:56:46 33 4
mua khóa gpt4 Nike

giống Cách sử dụng thiết bị chặn Jersey để nhận nội dung yêu cầu Như đã đề cập trong , tôi đang sửa đổi EntityInputStream trong ContainerRequestFilter.

bộ lọc công khai (Yêu cầu ContainerRequest) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
Luồng đầu vào trong = request.getEntityInputStream();
try{
Readerwriter.writeTo(vào, ra);
byte[] requestEntity = out.toByteArray();

// LÀM ĐIỀU GÌ ĐÓ VỚI byte TẠI ĐÂY

request.setEntityInputStream(ByteArrayInputStream mới(requestEntity));

}/// code xử lý lỗi tại đây
}

Tuy nhiên, tôi không biết cách truy cập vào Luồng đầu vào đã sửa đổi. Tôi có thể lấy ServletContext trong tài nguyên, nhưng tôi không biết cách lấy đối tượng mà tôi thực sự đang sửa đổi trong bộ lọc, đó là ContainerRequest.

Tôi có thể làm điều gì đó như thế này không? Jersey sẽ không bắt đầu khi tôi thử điều này:

@Bưu kiện
@Path("/test")
kiểm tra phản hồi công khai(@Context ContainerRequest cr){
// bla bla
trở lại....
}

Lỗi áo đấu:

Phương thức public javax.ws.rs.core.Response example.TestController.test(com.sun.jersey.spi.container.ContainerRequest) Thiếu phần phụ thuộc, POST được chú thích là tài nguyên, lớp example.TestController, không được công nhận là phương thức tài nguyên hợp lệ.

Tôi đang sử dụng phiên bản cũ hơn của Jersey 1.8 nên tôi không chắc đó có phải là một phần của vấn đề hay không.

câu trả lời hay nhất

Tất cả những gì bạn cần làm là chấp nhận InputStream Là nội dung thực thể trong phương thức tài nguyên. nếu bạn muốn ByteArrayInputStream Chỉ cần bỏ phiếu cho nó.

@BƯU KIỆN
Bài đăng phản hồi công khai(InputStream in) {
ByteArrayInputStream bin = (ByteArrayInputStream)in;
}

Nếu bạn chưa biết, cách Jersey chuyển đổi luồng yêu cầu (đối với nội dung yêu cầu) thành loại Java (ví dụ: JSON thành POJO) là thông qua MessageBodyReader nhận ra. Thứ hai. bạn có thể Nhà cung cấp thực thể JAX-RS Đọc thêm về họ.

Jersey đã cung cấp một số trình đọc tiêu chuẩn cho các loại có thể chuyển đổi dễ dàng như String. Hầu hết các loại nội dung có thể được chuyển đổi thành chuỗi. Một lần nữa, nó có một đầu đọc để xử lý InputStream. Đây có lẽ là chuyển đổi đơn giản nhất vì yêu cầu đã có sẵn InputStream được truyền vào, vì vậy thực ra tất cả những gì người đọc cần làm là trả về luồng ban đầu, đây là nội dung được truyền vào phương thức của chúng ta.

Nếu chúng ta nhìn vào việc thực hiện Nhà cung cấp luồng đầu vào , chúng ta có thể thấy rằng đây là những gì thực sự xảy ra. Luồng ban đầu được trả về đơn giản .Vì bộ lọc diễn ra trước trình đọc nên trình đọc chỉ cần trả về luồng mà chúng tôi đã đặt.

Đây là một cách sử dụng Khung kiểm tra Jersey Ví dụ đầy đủ về

lớp công khai StreamFilterTest mở rộng JerseyTest {

lớp tĩnh công khai inputStreamFilter triển khai ContainerRequestFilter {

@Ghi đè
bộ lọc ContainerRequest công khai (Yêu cầu ContainerRequest) {
thử {
ByteArrayOutputStream out = new ByteArrayOutputStream();
Luồng đầu vào trong = request.getEntityInputStream();
ReaderWriter.writeTo(vào, ra);

byte[] requestBytes = out.toByteArray();
byte[] worldBytes = "World".getBytes(StandardCharsets.UTF_8);
byte[] newBytes = byte mới[requestBytes.length + worldBytes.length];
System.arraycopy(requestBytes, 0, newBytes, 0, requestBytes.length);
System.arraycopy(worldBytes, 0, newBytes, requestBytes.length, worldBytes.length);

request.setEntityInputStream(ByteArrayInputStream mới(newBytes));
} bắt (IOException cũ) {
Logger.getLogger(InputStreamFilter.class.getName()).log(Level.SEVERE, null, ex);
ném RuntimeException mới (ví dụ);
}

yêu cầu trả lại;
}
}

@Path("luồng")
lớp tĩnh công khai StreamResource {

@BƯU KIỆN
bài đăng Chuỗi công khai (InputStream in) ném Ngoại lệ {
ByteArrayInputStream bin = (ByteArrayInputStream) trong;
Trình soạn thảo StringWriter = new StringWriter();
ReaderWriter.writeTo(InputStreamReader mới(bin), trình ghi);
return writer.toString();
}
}

lớp tĩnh công khai AppConfig mở rộng DefaultResourceConfig {
AppConfig công khai() {
super(StreamResource.class);
getContainerRequestFilters().add(InputStreamFilter() mới);
}
}

@Ghi đè
cấu hình WebAppDescriptor công khai () {
trả về WebAppDescriptor.Builder() mới
.initParam(WebComponent.RESOURCE_CONFIG_CLASS,
AppConfig.class.getName())
.xây dựng();
}

@Bài kiểm tra
khoảng trống công khai nên_return_hello_world() {
Phản hồi chuỗi = Resource().path("stream").post(String.class, "Xin chào");
khẳng địnhEquals("Xin chào thế giới", phản hồi);
}
}

Đây là một sự phụ thuộc thử nghiệm


com.sun.jersey.jersey-test-framework
jersey-test-framework-grizzly2
1.17.1
kiểm tra

Về java - Jersey inputStream được sửa đổi trong filter. Không thể tìm ra cách truy cập inputStream đã sửa đổi trong Tài nguyên Jersey, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/32632342/

33 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress