OSGI Enroute DTO 中的字符串是 'compressed'
Strings in OSGI Enroute DTOs are 'compressed'
我当前的任务是使用 OSGI Enroute (http://enroute.osgi.org/) 和 Angular 构建应用程序(尽管我们选择使用 Angular2/4 而不是捆绑的 AngularJS ).
到目前为止一切顺利。我有一个 REST Java 应用程序,它响应来自 Angular 前端的各种请求,但我目前 运行 遇到了问题。为了使开发更容易,我在端口 4200 上提供 Angular 代码,后端在端口 8080 上侦听。CORS 正在运行,因此我能够在构建代码时发送和接收请求。这可能与问题有关,也可能无关。
问题 是当使用 String
内容超过 21 个字符 的 DTO 响应时,值正在变得 'compressed.' 我在尝试使用收到的值 (UUID
) 作为后续 GET
请求的键时注意到了这一点。检查 DTO
class 我已经确认 toString()
方法确实调用了私有 compress
方法,它将接受任何长度超过 21 个字符和 return 的字符串类似于 this nine...last nine
的东西,这使得很难从 ... {"uuid":"95b90155-...ee5c02200", "name":"My Object"}
...
重新获得 UUID
所以...给出这样的东西:
import org.osgi.dto.DTO;
public final class MyDTO extends DTO
{
public String uuid;
public String name;
}
和这样的 REST 应用程序:
@RequireBootstrapWebResource(resource="css/bootstrap.css")
@RequireWebserverExtender
@RequireConfigurerExtender
@Component(name="web", propery={"debug=true"})
public final class MyApplication implements REST
{
private boolean debug = false;
public MyDTO getMe(RESTRequest request)
{
MyDTO dto = new MyDTO();
dto.name = "My Object";
dto.uuid = UUID.randomUUID().toString();
return dto;
}
@SuppressWarnings("unused")
@Activate
void activate(ComponentContext component, BundleContext bundle,
Map<String, Object> config)
{
if ("true".equals(config.get("debug"))
{
debug = true;
}
}
}
为了在我的 JSON 回复中避免这个值 'compression' 我错过了什么?
我尝试过的东西
- (有效的方法)覆盖
DTO
提供的 toString()
方法。这可行,但似乎不是最佳解决方案。然后,我将不得不为任何可能具有超过 21 个字符的字符串值覆盖 toString()
。文档表明目的是为了调试,这可能意味着我没有 return 正确的类型?
- 将
request
的_response()
的内容类型设置为application/json
:我在[=64=中看到的结果] Web控制台仍然是压缩字符串
我写了 DTO.toString 方法。明确记录了未指定输出格式,它用作调试工具而不是用于序列化。这就是为什么 impl "compresses" strings.
如果需要序列化 DTO,则需要为此目的使用代码。请参阅 https://github.com/osgi/osgi.enroute/blob/master/osgi.enroute.base.api/src/osgi/enroute/dto/api/DTOs.java 了解可以将 DTO 转换为 JSON 格式的 API。
我当前的任务是使用 OSGI Enroute (http://enroute.osgi.org/) 和 Angular 构建应用程序(尽管我们选择使用 Angular2/4 而不是捆绑的 AngularJS ).
到目前为止一切顺利。我有一个 REST Java 应用程序,它响应来自 Angular 前端的各种请求,但我目前 运行 遇到了问题。为了使开发更容易,我在端口 4200 上提供 Angular 代码,后端在端口 8080 上侦听。CORS 正在运行,因此我能够在构建代码时发送和接收请求。这可能与问题有关,也可能无关。
问题 是当使用 String
内容超过 21 个字符 的 DTO 响应时,值正在变得 'compressed.' 我在尝试使用收到的值 (UUID
) 作为后续 GET
请求的键时注意到了这一点。检查 DTO
class 我已经确认 toString()
方法确实调用了私有 compress
方法,它将接受任何长度超过 21 个字符和 return 的字符串类似于 this nine...last nine
的东西,这使得很难从 ... {"uuid":"95b90155-...ee5c02200", "name":"My Object"}
...
UUID
所以...给出这样的东西:
import org.osgi.dto.DTO;
public final class MyDTO extends DTO
{
public String uuid;
public String name;
}
和这样的 REST 应用程序:
@RequireBootstrapWebResource(resource="css/bootstrap.css")
@RequireWebserverExtender
@RequireConfigurerExtender
@Component(name="web", propery={"debug=true"})
public final class MyApplication implements REST
{
private boolean debug = false;
public MyDTO getMe(RESTRequest request)
{
MyDTO dto = new MyDTO();
dto.name = "My Object";
dto.uuid = UUID.randomUUID().toString();
return dto;
}
@SuppressWarnings("unused")
@Activate
void activate(ComponentContext component, BundleContext bundle,
Map<String, Object> config)
{
if ("true".equals(config.get("debug"))
{
debug = true;
}
}
}
为了在我的 JSON 回复中避免这个值 'compression' 我错过了什么?
我尝试过的东西
- (有效的方法)覆盖
DTO
提供的toString()
方法。这可行,但似乎不是最佳解决方案。然后,我将不得不为任何可能具有超过 21 个字符的字符串值覆盖toString()
。文档表明目的是为了调试,这可能意味着我没有 return 正确的类型? - 将
request
的_response()
的内容类型设置为application/json
:我在[=64=中看到的结果] Web控制台仍然是压缩字符串
我写了 DTO.toString 方法。明确记录了未指定输出格式,它用作调试工具而不是用于序列化。这就是为什么 impl "compresses" strings.
如果需要序列化 DTO,则需要为此目的使用代码。请参阅 https://github.com/osgi/osgi.enroute/blob/master/osgi.enroute.base.api/src/osgi/enroute/dto/api/DTOs.java 了解可以将 DTO 转换为 JSON 格式的 API。