当前位置: 首页 > news >正文

河池网站制作济南网站建设选聚搜网络认可

河池网站制作,济南网站建设选聚搜网络认可,登录网址,区块链外包开发纹理和基元最近#xff0c;我们为您提供了新的HTTP框架HttpMate。 在介绍性文章中 #xff0c;我们将请求和响应映射到域对象称为“最复杂的技术细节”#xff0c;以及如何通过另一个伴侣MapMate帮助我们。 实际上#xff0c;当将请求属性映射到您的域对象时#xff0c;M… 纹理和基元 最近我们为您提供了新的HTTP框架HttpMate。 在介绍性文章中 我们将请求和响应映射到域对象称为“最复杂的技术细节”以及如何通过另一个伴侣MapMate帮助我们。 实际上当将请求属性映射到您的域对象时MapMate减轻了HttpMate的负担。 它负责将响应转换为适当的格式JSONXMLYAML等本质上执行反序列化和序列化但还有很多其他工作。 在本文中我们将重点介绍MapMate如何以受控和可预测的方式帮助我们处理反序列化请求/响应对象。 自定义基元 让我们回顾一下上一篇文章中的示例 我们有一个简单的UseCase发送电子邮件。 为此我们需要一个Email对象该对象应具有 发件人 接收者 学科 身体 所有这些字段都可以表示为字符串甚至可以表示为字节数组。 选择用来表示数据的通用类型越多以后解释数据的可能性就越大。 想象一下以下方法 public Object sendEmail(final Object sender, final Object receiver, final Object subject, final Object body) {... } 这给我们留下了很多未解决的问题 是发件人instanceOf是字符串还是字节[] 编码是什么 拉链被压缩了吗 清单继续。 尽管在某些情况下这可能是适当的但我敢打赌您会更满意 public String sendEmail(final String sender, final String receiver, final String subject, final String body) {... } 后者留出了较少的解释空间例如我们不再需要假设编码或完全质疑参数的类型。 但是它仍然是模棱两可的发件人字段是否带有用户名或她的电子邮件地址 同样的歧义是编写单元测试时产生无限不确定性的原因……在某种程度上使用随机字符串生成器来测试一种人们只能接受电子邮件地址的方法。 对于人员和编译器以下方法签名在歧义方面做得更好 public Receipt sendEmail(final EmailAddress sender, final EmailAddress receiver, final Subject subject, final Body body) {... } 我们可以以相同的方式相信字符串是字符串整数是整数我们现在可以相信EmailAddress是电子邮件地址主题实际上是主题–它们成为了send email方法的自定义原语。 发件人和接收者不是面面俱到的“字符串”它们与“主题”和“正文”有很大不同。 它们是电子邮件地址我们可以通过使用一些理智的正则表达式来验证其值来表示它们。 谨防ReDoS 使用工厂方法作为创建“始终有效”对象的方法的合理性已得到广泛讨论和验证。 考虑到这一点我们将为示例用例创建一个EmailAddress类然后将其用作Sender和Receiver字段的自定义原始类型。 public final class EmailAddress {private final String value;private EmailAddress(final String value) {this.value value;}public static EmailAddress fromStringValue(final String value) {final String validated EmailAddressValidator.ensureEmailAddress(value, emailAddress);return new EmailAddress(validated);} } 由于–唯一的实例变量是私有的且是最终变量因此只能使用私有的构造函数进行分配只有在将其传递给构造函数之前可以使用验证输入的公共工厂方法从类外部调用该私有构造函数–我们可以请确保每当我们收到EmailAddress实例时它都是有效的。 如果您现在对EmailAddressValidator实现感到好奇请确保签出此示例项目的源代码 。 现在我们的域对象不仅可以使用默认原语例如StringDoubleInteger等还可以使用自定义原语例如EmailAddress和BodySubject等。通常尽管我们需要能够将域对象存储在数据库中或将其传达给其他服务或UI。 尽管没有其他方知道名为EmailAddress的自定义基元。 因此我们需要它的“表示形式”即HTTP持久性和人性化的东西–字符串。 public final class EmailAddress {private final String value;public static EmailAddress fromStringValue(final String value) {final String validated EmailAddressValidator.ensureEmailAddress(value, emailAddress);return new EmailAddress(validated);}public String stringValue() {return this.value;} } 我们添加的方法“ stringValue”是自定义基元的字符串表示形式。 现在我们可以发送EmailAddress的“ stringValue”然后根据接收到的值对其进行重构。 本质上“ fromString”和“ stringValue”方法分别是EmailAddress的“反序列化”和“序列化”机制。 按照这种方法我们还可以为电子邮件的正文和主题创建自定义基元 public final class Body {private final String value;public static Body fromStringValue(final String value) {final String emailAddress LengthValidator.ensureLength(value, 1, 1000, body);return new Body(emailAddress);}public String stringValue() {return this.value;} }public final class Subject {private final String value;public static Subject fromStringValue(final String value) {final String validated LengthValidator.ensureLength(value, 1, 256, subject);return new Subject(validated);}public String stringValue() {return this.value;} }数据传输对象 有了我们的自定义基元我们现在可以创建适当的数据传输对象–电子邮件这是一个非常简单的任务因为它基本上是一个不变的结构 public final class Email {public final EmailAddress sender;public final EmailAddress receiver;public final Subject subject;public final Body body; } 相同的“始终有效”的方法也适用于数据传输对象除了在这里由于我们利用了自定义基元因此时间更短。 DTO的工厂方法可以像验证必填字段的存在一样简单也可以像应用跨字段验证一样复杂。 public final class Email {public final EmailAddress sender;public final EmailAddress receiver;public final Subject subject;public final Body body;public static Email restore(final EmailAddress sender,final EmailAddress receiver,final Subject subject,final Body body) {RequiredParameterValidator.ensureNotNull(sender, sender);RequiredParameterValidator.ensureNotNull(receiver, receiver);RequiredParameterValidator.ensureNotNull(body, body);return new Email(sender, receiver, subject, body); } 不幸的是现代反序列化和验证框架在这种DTO中不能很好地发挥作用。 这是一个JSON示例如果您使用默认配置将电子邮件DTO馈送到这样的框架则可能会获得最佳效果 {sender: {value: senderexample.com},receiver: {value: receiverexample.com},subject: {value: subject},body: {value: body} } 虽然人们期望的是 {sender: senderexample.com,receiver: receiverexample.com,subject: subject,body: body } 尽管可以使用大量样板代码来缓解此问题但是验证是另一种野兽当您希望从服务器“一次报告所有验证错误”时验证就变得致命。 为什么不立即告诉用户发送方和接收方均无效而不是发送寻求许可A38的请求发送给用户。 实际上这就是我们在尝试编写现代微服务时同时又遵循Clean Code的最佳实践的感觉Domain Driven DesignDomain Driven Security的“始终有效”方法…… 这就是MapMate需要解决的问题。 MapMate 与HttpMate一样我们确保提供一个易于构建的构建器同时保留细粒度定制的可能性。 这是使我们的电子邮件示例序列化反序列化和验证我们的自定义基元和DTO的绝对最低配置。 public static MapMate mapMate() {return MapMate.aMapMate(com.envimate.examples.email_use_case).usingJsonMarshallers(new Gson()::toJson, new Gson()::fromJson).build(); } 这部分将使以下JSON成为有效请求 {sender: senderexample.com,receiver: receiverexample.com,subject: Hello world!,body: Hello from Sender to Receiver! } 您必须指定要扫描递归的程序包和一对非编组器。 可以是任何可以从Map生成字符串的内容反之亦然。 这是使用ObjectMapper的示例 final ObjectMapper objectMapper new ObjectMapper(); return MapMate.aMapMate(com.envimate.examples.email_use_case).usingJsonMarshallers(value - {try {return objectMapper.writeValueAsString(value);} catch (JsonProcessingException e) {throw new UnsupportedOperationException(Could not parse value value, e);}}, new Unmarshaller() {OverridepublicT unmarshal(final String input, final Classtype) {try {return objectMapper.readValue(input, type);} catch (final IOException e) {throw new UnsupportedOperationException(Could not parse value input to type type, e);}}}).withExceptionIndicatingValidationError(CustomTypeValidationException.class).build(); 承诺的验证异常聚合又如何呢 在我们的示例中如果自定义原语或DTO无效则所有验证都返回CustomTypeValidationException的实例。 添加以下行以指示MapMate将您的Exception类识别为验证错误的指示。 public static MapMate mapMate() {return MapMate.aMapMate(com.envimate.examples.email_use_case).usingJsonMarshallers(new Gson()::toJson, new Gson()::fromJson).withExceptionIndicatingValidationError(CustomTypeValidationException.class).build(); } 现在如果我们尝试以下请求 {sender: not-a-valid-sender-value,receiver: not-a-valid-receiver-value,subject: Hello world!,body: Hello from Sender to Receiver! } 我们将收到以下答复 HTTP/1.1 400 Bad Request Date: Tue, 04 Jun 2019 18:30:51 GMT Transfer-encoding: chunked{message:receiver: Invalid email address: not-a-valid-receiver-value,sender: Invalid email address: not-a-valid-sender-value}最后的话 此处提供的MapMate生成器可简化初始使用。 但是所有描述的默认值都是可配置的此外您可以从“自定义基元”和“ DTO”中排除程序包和类可以配置哪些异常被视为“验证错误”以及如何对其进行处理还可以为“自定义”指定其他方法名称原始序列化或者提供您的lambda来同时进行这两个序列的反序列化。 有关MapMate的更多示例和详细信息请查看MapMate存储库 。 让我们知道您的想法以及您接下来想在MapMate中看到的功能 翻译自: https://www.javacodegeeks.com/2019/08/deserialization-and-validation-of-custom-primitives-and-dtos.html纹理和基元
http://www.sadfv.cn/news/416525/

相关文章:

  • 上海网站建设导航wordpress主题+插件下载
  • 建设银行面试通知网站多媒体网页设计
  • 模仿茶叶的网站制作西安发布市民
  • 做网站公司上班违法吗咨询公司英文
  • 原创音乐网站源码找平台推广
  • 江苏省建设执业网站手机网站建设价格低
  • 枣庄市建设局网站wordpress query.php
  • 网站开发运行环境有哪些wordpress主题添加双备案号
  • 本地东莞网站建设重庆网站制作特点优势
  • 盘锦市网站建设民房做酒店出租网站app
  • 刷粉网站推广快点巩义网络推广外包
  • 网站开发如何兼容不同ie站酷网素材图库海报设计
  • 宁波外贸网站制作潍坊网站制作保定公司电话
  • 网站建设 技术团队介绍怎么做宣传推广
  • asp.net企业网站模板省交通建设质安监督局网站
  • 网站建设维护公司虚拟货币交易网站建设
  • 杭州电商网站平台开发公司衡阳网站建设 千度网络
  • 做网站的技术性说明upscale wordpress
  • 同一家公司可以做几个网站吗包头seo优化
  • 航达建设网站百度收录的网站多久更新一次
  • 河南网站制作公司托管平台
  • 台州黄岩网站建设搭建网站合同
  • 营销型网站建设教程视频教程优化网站公司哪家口碑好
  • 网站制作的步骤不包括教学单位 网站建设
  • 优化网站关键词排名软件嘉兴招聘网
  • 洛阳网站设计公司wordpress编辑器怎么变
  • 做网站全自动cpa引流yangdesign工业设计公司
  • 河南海绵城市建设网站大新网站制作
  • 仿腾讯网站源码在哪里可以建网站
  • 茂名网站建设服务表白网页代码