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

南京模板网站建设企业网页模板网站

南京模板网站建设企业,网页模板网站,哪里的网站建设好,凡客诚品创始人java jax-rs我过去已经两次接触过这个主题。 首先#xff0c;在我的文章《 在Java EE 6中将Bean验证与JAX-RS集成》中 #xff0c;描述了甚至在Java EE平台规范中尚未定义之前#xff0c;如何在JBoss AS 7中将Bean验证与JAX-RS结合使用。 后来#xff0c;在一篇为《 JAX Ma… java jax-rs 我过去已经两次接触过这个主题。 首先在我的文章《 在Java EE 6中将Bean验证与JAX-RS集成》中 描述了甚至在Java EE平台规范中尚未定义之前如何在JBoss AS 7中将Bean验证与JAX-RS结合使用。 后来在一篇为《 JAX Magazine 》撰写并随后发表在《 JAXenter 》上的文章中使用了带有Glassfish 4服务器第一台经过Java EE 7认证的服务器的Java EE 7中定义的新标准方式。 现在以前称为JBoss Application Server的WildFly 8终于达到了最终版本并加入了Java EE 7认证的服务器俱乐部现在该发表新文章了重点介绍了这两个应用服务器GlassFish 4和WildFly之间的特殊性和差异。 8。 规格和API Java EE 7是期待已久的Java EE 6的重大改进。随着Java EE的每个发行版都添加了新功能并增强了现有规范。 Java EE 7以Java EE 6的成功为基础并且继续致力于提高开发人员的生产力。 JAX-RS是RESTful Web服务的Java API是Java EE领域中发展最快的API之一。 当然这是由于基于REST的Web服务的大量采用以及使用这些服务的应用程序数量的增加。 这篇文章将介绍配置REST端点以支持JavaScript客户端并处理验证异常以将本地化错误消息发送到客户端的必要步骤以及HTTP错误状态代码。 源代码 本文随附的源代码可在GitHub上找到 。 Bean验证简介 JavaBeans Validation Bean验证 是一种新的验证模型可作为Java EE 6平台的一部分使用。 约束通过以JavaBeans组件例如托管Bean的字段方法或类上的注释形式的约束来支持Bean验证模型。 javax.validation.constraints包中提供了几个内置约束。 Java EE 7教程包含具有所有这些约束的列表。 Bean验证中的约束通过Java注释表示 public class Person {NotNullSize(min 2, max 50)private String name;// ... }Bean验证和RESTful Web服务 JAX-RS为提取请求值并将其绑定到Java字段属性和参数使用HeaderParam QueryParam等注释提供了强大的支持。它还支持通过非注释参数即将请求实体主体绑定到Java对象中 未使用任何JAX-RS批注进行批注的参数。 但是在JAX-RS 2.0之前必须以编程方式对资源类中的这些值进行任何其他验证。 最新版本的JAX-RS 2.0提供了一种解决方案使验证批注可以与JAX-RS批注结合使用。 以下示例显示了如何使用Pattern验证批注来验证路径参数 GET Path({id}) public Person getPerson(PathParam(id)Pattern(regexp [0-9], message The id must be a valid number)String id) {return persons.get(id); } 除了验证单个字段外您还可以使用Valid批注验证整个实体。 例如下面的方法接收一个Person对象并对其进行验证 POST public Response validatePerson(Valid Person person) {// ... }国际化 在前面的示例中我们使用了默认或硬编码的错误消息但这既是一种不好的做法又一点也不灵活。 I18n是Bean验证规范的一部分它使我们能够使用资源属性文件来指定自定义错误消息。 默认资源文件名称为ValidationMessages.properties并且必须包含属性/值对例如 person.id.notnullThe person id must not be null person.id.patternThe person id must be a valid number person.name.sizeThe person name must be between {min} and {max} chars long 注意 {min}和{max}是指与消息关联的约束的属性。 一旦定义这些消息就可以注入到验证约束中例如 POST Path(create) Consumes(MediaType.APPLICATION_FORM_URLENCODED) public Response createPerson(FormParam(id)NotNull(message {person.id.notnull})Pattern(regexp [0-9], message {person.id.pattern})String id,FormParam(name)Size(min 2, max 50, message {person.name.size})String name) {Person person new Person();person.setId(Integer.valueOf(id));person.setName(name);persons.put(id, person);return Response.status(Response.Status.CREATED).entity(person).build(); } 要提供其他语言的翻译必须使用翻译后的消息创建一个新文件ValidationMessages_XX.properties 其中XX是所提供语言的代码。 不幸的是对于某些应用程序服务器默认的Validator提供程序不基于特定的HTTP请求支持i18n。 他们不考虑Accept-Language HTTP标头并且始终使用Locale.getDefault()提供的默认Locale 。 为了能够使用Accept-Language HTTP标头映射到浏览器选项中配置的语言来更改Locale 您必须提供一个自定义实现。 自定义验证器提供程序 尽管WildFly 8正确使用Accept-Language HTTP标头来选择正确的资源包但其他服务器例如GlassFish 4却不使用此标头。 因此为了完整性和与GlassFish代码的比较在同一个GitHub项目下提供 我还为WildFly实现了自定义的Validator提供程序。 如果要查看GlassFish示例请访问JAXenter上的Bean验证与JAX-RS集成。 将RESTEasy依赖项添加到Maven WildFly使用RESTEasy 即JAX-RS规范的JBoss实现。 验证程序提供程序和Exception Mapper所需的RESTEasy依赖关系将在本文后面的内容中进行讨论。 让我们将其添加到Maven dependencyManagementdependenciesdependencygroupIdorg.jboss.resteasy/groupIdartifactIdresteasy-bom/artifactIdversion3.0.6.Final/versionscopeimport/scopetypepom/type/dependency/dependencies /dependencyManagementdependenciesdependencygroupIdorg.jboss.resteasy/groupIdartifactIdresteasy-jaxrs/artifactIdscopeprovided/scope/dependencydependencygroupIdorg.jboss.resteasy/groupIdartifactIdresteasy-validator-provider-11/artifactIdscopeprovided/scope/dependency /dependencies 创建一个ThreadLocal来存储Locale从Accept-Language HTTP标头 ThreadLocal变量与普通变量不同每个访问线程的线程都有其自己的独立初始化的变量副本。 /*** {link ThreadLocal} to store the Locale to be used in the message interpolator.*/ public class LocaleThreadLocal {public static final ThreadLocalLocale THREAD_LOCAL new ThreadLocalLocale();public static Locale get() {return (THREAD_LOCAL.get() null) ? Locale.getDefault() : THREAD_LOCAL.get();}public static void set(Locale locale) {THREAD_LOCAL.set(locale);}public static void unset() {THREAD_LOCAL.remove();} } 创建一个请求过滤器以读取Accept-Language HTTP标头 请求过滤器负责读取客户端在Accept-Language HTTP标头中发送的第一语言并将Accept-Language Locale存储在我们的ThreadLocal /*** Checks whether the {code Accept-Language} HTTP header exists and creates a {link ThreadLocal} to store the* corresponding Locale.*/ Provider public class AcceptLanguageRequestFilter implements ContainerRequestFilter {Contextprivate HttpHeaders headers;Overridepublic void filter(ContainerRequestContext requestContext) throws IOException {if (!headers.getAcceptableLanguages().isEmpty()) {LocaleThreadLocal.set(headers.getAcceptableLanguages().get(0));}} } 创建自定义消息插值器以强制执行特定的Locale 接下来创建一个自定义消息插值器以通过绕过或覆盖默认的Locale策略来强制执行特定的Locale值 /*** Delegates to a MessageInterpolator implementation but enforces a given Locale.*/ public class LocaleSpecificMessageInterpolator implements MessageInterpolator {private final MessageInterpolator defaultInterpolator;public LocaleSpecificMessageInterpolator(MessageInterpolator interpolator) {this.defaultInterpolator interpolator;}Overridepublic String interpolate(String message, Context context) {return defaultInterpolator.interpolate(message, context, LocaleThreadLocal.get());}Overridepublic String interpolate(String message, Context context, Locale locale) {return defaultInterpolator.interpolate(message, context, locale);} } 配置验证器提供程序 RESTEasy通过查找实现ContextResolverGeneralValidator的提供程序来获得Bean验证实现。 要配置新的验证服务提供者以使用我们的自定义消息插值器请添加以下内容 /*** Custom configuration of validation. This configuration can define custom:* ul* liMessageInterpolator - interpolates a given constraint violation message./li* liTraversableResolver - determines if a property can be accessed by the Bean Validation provider./li* liConstraintValidatorFactory - instantiates a ConstraintValidator instance based off its class.* liParameterNameProvider - provides names for method and constructor parameters./li ** /ul*/ Provider public class ValidationConfigurationContextResolver implements ContextResolverGeneralValidator {/*** Get a context of type {code GeneralValidator} that is applicable to the supplied type.** param type the class of object for which a context is desired* return a context for the supplied type or {code null} if a context for the supplied type is not available from* this provider.*/Overridepublic GeneralValidator getContext(Class? type) {Configuration? config Validation.byDefaultProvider().configure();BootstrapConfiguration bootstrapConfiguration config.getBootstrapConfiguration();config.messageInterpolator(new LocaleSpecificMessageInterpolator(Validation.byDefaultProvider().configure().getDefaultMessageInterpolator()));return new GeneralValidatorImpl(config.buildValidatorFactory(),bootstrapConfiguration.isExecutableValidationEnabled(),bootstrapConfiguration.getDefaultValidatedExecutableTypes());} } 映射异常 默认情况下当验证失败时容器将引发异常并将HTTP错误返回给客户端。 Bean验证规范定义了一个小的异常层次结构它们都继承自ValidationException 可以在验证引擎初始化期间或在我们的情况下更重要在输入/输出值验证期间抛出异常 ConstraintViolationException 。 如果抛出的异常是除ConstraintViolationException之外的ValidationException的子类则此异常将映射到状态码为500内部服务器错误的HTTP响应。 另一方面当抛出ConstraintViolationException时将返回两个不同的状态代码 500内部服务器错误 如果在验证方法返回类型时引发了异常。 400错误请求 除此以外。 不幸的是WildFly并没有抛出ConstraintViolationException异常以获取无效的输入值 ResteasyViolationException抛出了一个ResteasyViolationException 该异常实现了ValidationException接口。 可以自定义此行为以允许我们将错误消息添加到返回给客户端的响应中 /*** {link ExceptionMapper} for {link ValidationException}.* p* Send a {link ViolationReport} in {link Response} in addition to HTTP 400/500 status code. Supported media types* are: {code application/json} / {code application/xml} (if appropriate provider is registered on server).* /p** see org.jboss.resteasy.api.validation.ResteasyViolationExceptionMapper The original WildFly class:* {code org.jboss.resteasy.api.validation.ResteasyViolationExceptionMapper}*/ Provider public class ValidationExceptionMapper implements ExceptionMapperValidationException {Overridepublic Response toResponse(ValidationException exception) {if (exception instanceof ConstraintDefinitionException) {return buildResponse(unwrapException(exception), MediaType.TEXT_PLAIN, Status.INTERNAL_SERVER_ERROR);}if (exception instanceof ConstraintDeclarationException) {return buildResponse(unwrapException(exception), MediaType.TEXT_PLAIN, Status.INTERNAL_SERVER_ERROR);}if (exception instanceof GroupDefinitionException) {return buildResponse(unwrapException(exception), MediaType.TEXT_PLAIN, Status.INTERNAL_SERVER_ERROR);}if (exception instanceof ResteasyViolationException) {ResteasyViolationException resteasyViolationException ResteasyViolationException.class.cast(exception);Exception e resteasyViolationException.getException();if (e ! null) {return buildResponse(unwrapException(e), MediaType.TEXT_PLAIN, Status.INTERNAL_SERVER_ERROR);} else if (resteasyViolationException.getReturnValueViolations().size() 0) {return buildViolationReportResponse(resteasyViolationException, Status.BAD_REQUEST);} else {return buildViolationReportResponse(resteasyViolationException, Status.INTERNAL_SERVER_ERROR);}}return buildResponse(unwrapException(exception), MediaType.TEXT_PLAIN, Status.INTERNAL_SERVER_ERROR);}protected Response buildResponse(Object entity, String mediaType, Status status) {ResponseBuilder builder Response.status(status).entity(entity);builder.type(MediaType.TEXT_PLAIN);builder.header(Validation.VALIDATION_HEADER, true);return builder.build();}protected Response buildViolationReportResponse(ResteasyViolationException exception, Status status) {ResponseBuilder builder Response.status(status);builder.header(Validation.VALIDATION_HEADER, true);// Check standard media types.MediaType mediaType getAcceptMediaType(exception.getAccept());if (mediaType ! null) {builder.type(mediaType);builder.entity(new ViolationReport(exception));return builder.build();}// Default media type.builder.type(MediaType.TEXT_PLAIN);builder.entity(exception.toString());return builder.build();}protected String unwrapException(Throwable t) {StringBuffer sb new StringBuffer();doUnwrapException(sb, t);return sb.toString();}private void doUnwrapException(StringBuffer sb, Throwable t) {if (t null) {return;}sb.append(t.toString());if (t.getCause() ! null t ! t.getCause()) {sb.append([);doUnwrapException(sb, t.getCause());sb.append(]);}}private MediaType getAcceptMediaType(ListMediaType accept) {IteratorMediaType it accept.iterator();while (it.hasNext()) {MediaType mt it.next();/** application/xml media type causes an exception:* org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response* object of type: org.jboss.resteasy.api.validation.ViolationReport of media type: application/xml*//*if (MediaType.APPLICATION_XML_TYPE.getType().equals(mt.getType()) MediaType.APPLICATION_XML_TYPE.getSubtype().equals(mt.getSubtype())) {return MediaType.APPLICATION_XML_TYPE;}*/if (MediaType.APPLICATION_JSON_TYPE.getType().equals(mt.getType()) MediaType.APPLICATION_JSON_TYPE.getSubtype().equals(mt.getSubtype())) {return MediaType.APPLICATION_JSON_TYPE;}}return null;} } 上面的示例是ExceptionMapper接口的实现该接口映射ValidationException类型的异常。 验证失败时Validator实现将引发此异常。 如果该异常是ResteasyViolationException的实例 ResteasyViolationException除了HTTP 400/500状态代码外我们ResteasyViolationException在响应中发送ViolationReport 。 这样可以确保客户端收到格式化的响应而不仅仅是从资源传播的异常。 产生的输出类似于以下内容JSON格式 {exception: null,fieldViolations: [],propertyViolations: [],classViolations: [],parameterViolations: [{constraintType: PARAMETER,path: getPerson.id,message: The id must be a valid number,value: test}],returnValueViolations: [] }运行和测试 要运行本文使用的应用程序请使用Maven构建项目将其部署到WildFly 8应用程序服务器中然后将浏览器指向http// localhost8080 / jaxrs-beanvalidation-javaee7 / 。 另外您也可以运行在类中的测试PersonsIT其内置的Arquillian和JUnit的 。 Arquillian将自动启动嵌入式WildFly 8容器因此请确保您没有在同一端口上运行其他服务器。 建议和改进 我们依靠应用程序服务器代码来实现自定义验证程序提供程序。 在GlassFish 4上需要实现ContextResolver ContextResolverValidationConfig 而在WildFly 8上我们需要实现ContextResolverGeneralValidator 。 为什么不在Java EE 7规范中定义一个ValidationConfig和GeneralValidator必须实现的接口而不是依赖于应用程序服务器特定的代码 使WildFly 8 Embedded易于使用和通过Maven进行配置。 当前要使Arquillian可以使用它需要下载WildFly发行版org.wildflywildfly-dist将其解压缩到target文件夹中并在Surefire / Failsafe Maven插件上配置系统属性 systemPropertyVariablesjava.util.logging.managerorg.jboss.logmanager.LogManager/java.util.logging.managerjboss.home${wildfly.home}/jboss.homemodule.path${wildfly.home}/modules/module.path /systemPropertyVariables 而对于Glassfish您只需要定义正确的依赖项org.glassfish.main.extrasglassfish-embedded-all。 使RESTEasy成为WildFly Embedded的可传递依赖项。 仅通过定义provided WildFly Embedded依赖项在编译时就可以使用所有WildFly模块这将是一个很好的生产力提升。 当前无法在Eclipse上使用选项Run As JUnit Test 因为必须存在名为jbossHome的系统属性。 Eclipse不会从Surefire / Failsafe配置中读取此属性。 有没有解决方法 当使用ExceptionMapperValidationException RESTEasy默认实现时以application/xml媒体类型请求数据并发生验证错误将引发以下异常 org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure:Could not find MessageBodyWriter for response object of type:org.jboss.resteasy.api.validation.ViolationReport of media type:application/xml 这是RESTEasy错误吗 翻译自: https://www.javacodegeeks.com/2014/04/validating-jax-rs-resource-data-with-bean-validation-in-java-ee-7-and-wildfly.htmljava jax-rs
http://www.pierceye.com/news/803068/

相关文章:

  • 城市生活网官方网站app成都设计院
  • 移动网站开发实训报告清远企业网站建设
  • 手机版网站如何做陕西城乡建设网站
  • 大连网站建设事件营销的特点
  • 做语音聊天网站要多少钱app界面设计模板素材免费
  • 设计网站专题页包括那些项目个人做网站要买什么域名
  • 建网站 方法中信建设有限责任公司获奖
  • 做宠物商品的网站无锡自适应网站开发
  • 网站后台怎样登陆做网站数据库及相关配置
  • 昆明seo网站排名网站代码 输入文字 跳出内容
  • 济南建站公司网站广州市网站设计
  • 网站模板做的比较好的公司网站制作汇报会
  • 个人网站图片海外网站备案
  • 兰州手机网站制作公司哪家好网店分销平台
  • 百度建立自己的网站网络工程师培训课程
  • 微网站的制作过程海南注册公司怎么注册
  • 公司网站制作投标建站行业都扁平化设计
  • 男女做a视频网站wordpress询价功能
  • 网站建设视频百度网盘下载我做网站价格
  • 江苏省建设集团有限公司网站首页东莞网络推广外包
  • 梁平网站建设莱芜网络营销
  • 自学网站建设需要什么学历学校网站建设总结报告
  • 增城新塘网站建设平面设计技术培训机构
  • 游戏网站开发视频运动品牌网页设计
  • 成都比较好的网站建设公司做视频后期的网站
  • 重庆网页搜索排名提升专业seo优化推广
  • 手机免费代理ip网站模板网站的优势有哪些
  • dede地方门户网站模板做网站备案
  • 域名访问网站的知识站酷网官网进入
  • 6入空间网站免费观看wordpress转盘抽奖源码