简而言之,我简化了问题很多。我正在调用此代码,并收到状态为200(OK)的响应:
Receiver.java :
Response response = componentInstanceService.getResource(componentResourceType);
但是,我不知道如何从此方法中检索正文中包含的字符串:
Sender.java:
@Override
public Response getResource(ComponentResourceType resourceType) {
String path = getPath();
return Response.ok(this.getClass().getResourceAsStream(path)).build();
}
请注意,只要Response
没问题,类之间的通信就可以正常工作了,但是,如何检索String
包含的Response
?
这是我想粗略地做的事情:
接收方:
String result = componentInstanceService.getResource(componentResourceType);
答案 0 :(得分:1)
如果你想从身体中读取字符串,只需使用
String result = componentInstanceService.getResource(componentResourceType).readEntity(String.class);
答案 1 :(得分:1)
documentation for Response非常清楚:
static Response.ResponseBuilder ok(java.lang.Object entity)
创建一个包含表示的新ResponseBuilder。
和
abstract java.lang.Object getEntity()
返回响应实体。
换句话说,传递给Response.ok
的对象就是实体。您可以使用Response的getEntity()方法检索它。
显然,你需要施展它:
Response response = componentInstanceService.getResource(componentResourceType);
InputStream dataSource = (InputStream) response.getEntity();
然后您可以将文本作为文本阅读。你还没有提到你的文本文件的字符集,所以我假设它是UTF-8:
String result;
try (Scanner scanner = new Scanner(dataSource, StandardCharsets.UTF_8)) {
result = scanner.useDelimiter("\\z").next();
}
<强>更新强>
我怀疑这可能发生。您将返回一个原始InputStream,它没有关于它是什么类型的数据的信息。
更改Sender.java以返回DataSource:
@Override
public DataSource getResource(ComponentResourceType resourceType) {
String path = getPath();
return new URLDataSource(this.getClass().getResource(path));
}
这样,JAX-RS服务不仅会返回HTTP 200 OK,还会返回与文件直觉类型对应的Content-Type标头。
然后您应该能够使用以下方法调用该方法:
DataSource dataSource = componentInstanceService.getResource(componentResourceType);
String result;
try (Scanner scanner = new Scanner(dataSource.getInputStream(), StandardCharsets.UTF_8)) {
result = scanner.useDelimiter("\\z").next();
}
实际上有一种更健壮的方式来读取数据源。您可以将其包装在DataHandler中:
DataSource dataSource = componentInstanceService.getResource(componentResourceType);
DataHandler handler = new DataHandler(dataSource);
DataFlavor flavor = DataFlavor.selectBestTextFlavor(
handler.getTransferDataFlavors());
if (flavor == null) {
// This should never happen with text files.
throw new IllegalArgumentException(
"Data has no flavors capable of supplying text.");
}
String result;
try (Reader reader = flavor.getReaderForText(handler)) {
StringBuilder s = new StringBuilder();
int c;
while ((c = reader.read()) >= 0) {
s.append((char) c);
}
result = s.toString();
} catch (UnsupportedFlavorException e) {
// Since we started with a flavor provided by the DataHandler,
// we should never get here.
throw new RuntimeException(e);
}