中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

如何靠裁圖找到網(wǎng)站中國最好的營(yíng)銷策劃公司

如何靠裁圖找到網(wǎng)站,中國最好的營(yíng)銷策劃公司,網(wǎng)站策劃初級(jí)方案模板,快速搭建網(wǎng)站域名綁定設(shè)置SpringBoot國際化和Validation融合 場(chǎng)景 在應(yīng)用交互時(shí),可能需要根據(jù)客戶端得語言來返回不同的語言數(shù)據(jù)。前端通過參數(shù)、請(qǐng)求頭等往后端傳入locale相關(guān)得參數(shù),后端獲取參數(shù),根據(jù)不同得locale來獲取不同得語言得文本信息返回給前端。 實(shí)現(xiàn)原…

SpringBoot國際化和Validation融合

場(chǎng)景

在應(yīng)用交互時(shí),可能需要根據(jù)客戶端得語言來返回不同的語言數(shù)據(jù)。前端通過參數(shù)、請(qǐng)求頭等往后端傳入locale相關(guān)得參數(shù),后端獲取參數(shù),根據(jù)不同得locale來獲取不同得語言得文本信息返回給前端。

實(shí)現(xiàn)原理

SpringBoot支持國際化和Validation,主要通過MessageSource接口和Validator實(shí)現(xiàn)。

國際化配置?

  • 編寫國際化配置文件,如messages_en_US.propertiesmessages_zh_CN.properties,并置于resources/i18n目錄下。
  • 配置application.ymlapplication.properties以指定國際化文件的位置,例如spring.messages.basename=i18n/messages。
  • 配置LocaleResolver以解析當(dāng)前請(qǐng)求的locale,常用的實(shí)現(xiàn)是AcceptHeaderLocaleResolver,它通過請(qǐng)求頭accept-language獲取當(dāng)前的locale。

?Validation配置?

  • 引入spring-boot-starter-validation依賴以支持Validation功能

  • 		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
    
  • 配置LocalValidatorFactoryBean以使用國際化的校驗(yàn)消息,需注入MessageSource

示例

引入依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

國際化配置文件

src/main/resources/i18n目錄下創(chuàng)建兩個(gè)文件:messages_en_US.propertiesmessages_zh_CN.properties

#messages_en_US.properties
welcome.message=Welcome to our website!#messages_zh_CN.properties
welcome.message=歡迎來到我們的網(wǎng)站!

配置MessageSource?

在Spring Boot的配置文件中(application.propertiesapplication.yml),配置MessageSource以指定國際化文件的位置。如果你打算使用Validation的默認(rèn)國際化文件,你實(shí)際上不需要為Validation單獨(dú)指定文件,因?yàn)?code>LocalValidatorFactoryBean會(huì)自動(dòng)查找ValidationMessages.properties。但是,你可以配置自己的國際化文件,并讓MessageSource同時(shí)服務(wù)于你的應(yīng)用消息和Validation消息。

# 國際化文件被放置在src/main/resources/i18n目錄下,并以messages為前綴
spring.messages.basename=i18n/messages,org.hibernate.validator.ValidationMessages
spring.messages.encoding=utf-8

注意:上面的配置假設(shè)你的自定義消息文件位于i18n/messages.properties,而Validation的默認(rèn)消息文件是org.hibernate.validator.ValidationMessages.properties。實(shí)際上,ValidationMessages.properties文件位于Hibernate Validator的jar包中,所以你不需要顯式地將它包含在你的資源目錄中。Spring Boot會(huì)自動(dòng)從classpath中加載它。

配置LocalValidatorFactoryBean?

在你的配置類中,創(chuàng)建一個(gè)LocalValidatorFactoryBean的bean,并將MessageSource注入到它中。這樣,LocalValidatorFactoryBean就會(huì)使用Spring的MessageSource來解析校驗(yàn)消息。

import org.hibernate.validator.HibernateValidator;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;import java.util.Properties;@Configuration
public class ValidateConfig {@Beanpublic LocalValidatorFactoryBean validatorFactoryBean(MessageSource messageSource) {LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();factoryBean.setValidationMessageSource(messageSource);//        設(shè)置使用 HibernateValidator 校驗(yàn)器factoryBean.setProviderClass(HibernateValidator.class);
//        設(shè)置 快速異常返回 只要有一個(gè)校驗(yàn)錯(cuò)誤就立即返回失敗,其他參數(shù)不在校驗(yàn)Properties properties = new Properties();properties.setProperty("hibernate.validator.fail_fast", "true");factoryBean.setValidationProperties(properties);
//        加載配置factoryBean.afterPropertiesSet();return factoryBean;}
}

使用校驗(yàn)

import javax.validation.constraints.NotNull;public class MyModel {@NotNull(message = "{not.null.message}")private String field;// getters and setters
}

messages.properties文件中,你可以添加

not.null.message=This field cannot be null.

而在Hibernate Validator的ValidationMessages.properties文件中,已經(jīng)包含了默認(rèn)的校驗(yàn)消息,如{javax.validation.constraints.NotNull.message}的值。

自定義校驗(yàn)

  • 定義約束注解:創(chuàng)建一個(gè)注解,用@Constraint標(biāo)記,并定義messagegroupspayload屬性
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;@Documented
@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyValidateContent.class)
public @interface MyValidate {String message() default "";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
  • 實(shí)現(xiàn)約束驗(yàn)證器**:創(chuàng)建一個(gè)實(shí)現(xiàn)了ConstraintValidator接口的類,并重寫isValid方法
  • isValid方法中使用ConstraintValidatorContext**?:如果驗(yàn)證失敗,使用ConstraintValidatorContextbuildConstraintViolationWithTemplate方法來構(gòu)建ConstraintViolation
import com.example.dto.ParamVo;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class MyValidateContent implements ConstraintValidator<MyValidate, ParamVo> {@Overridepublic void initialize(MyConstraint constraintAnnotation) {// 初始化代碼(如果需要的話)}@Overridepublic boolean isValid(ParamVo paramVo, ConstraintValidatorContext constraintValidatorContext) {if ("N".equals(paramVo.getSex())) {if (paramVo.getAge() < 18) {buildMessage(constraintValidatorContext, "template1");return false;}} else {if (paramVo.getAge() <  20) {buildMessage(constraintValidatorContext, "template2");return false;}}return true;}private void buildMessage(ConstraintValidatorContext context, String key) {String template = ('{'+key+'}').intern();context.buildConstraintViolationWithTemplate(template).addConstraintViolation();}
}

在這個(gè)例子中,如果sexN并且age小于18,驗(yàn)證器將使用ConstraintValidatorContext來構(gòu)建一個(gè)帶有錯(cuò)誤消息的ConstraintViolation。消息模板"{template1}"將會(huì)在驗(yàn)證失敗時(shí)被解析,并替換為你在MyValidate注解中定義的默認(rèn)消息或你在messages.properties文件中定義的國際化消息。

確保你的MyValidate注解定義了一個(gè)message屬性,并且你在messages.properties文件中有一個(gè)對(duì)應(yīng)的條目例如:

template1=男性要大于18
template2=女性要大于20
import com.example.validate.MyValidate;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;@Getter
@Setter
@MyValidate
public class ParamVo {@NotBlank(message = "{javax.validation.constraints.NotNull.message}")private String sex;@NotNull(message = "age 不能為空")private Integer age;@NotBlank(message = "{name.not.null}")@Length(max = 3,message = "{name.length.max}")private String name;
}

Controller層異常處理

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;@RestControllerAdvice
public class GlobalException {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<Object> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();BindingResult result = ex.getBindingResult();for (FieldError error : result.getFieldErrors()) {errors.put(error.getField(), error.getDefaultMessage());}// 這里可以根據(jù)實(shí)際需求定制返回的錯(cuò)誤信息結(jié)構(gòu)Map<String, Object> response = new HashMap<>();response.put("status", HttpStatus.BAD_REQUEST.value());response.put("errors", errors);return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);}
}

內(nèi)部方法校驗(yàn)

import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
//@Validated 
@Validated
public interface ServiceIntface {//校驗(yàn)返回值,校驗(yàn)入?yún)?/span>@NotNull Object hello(@NotNull @Min(10) Integer id, @NotNull String name);
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;@Slf4j
@Service
public class ServiceImpl implements ServiceIntface {@Overridepublic Object hello(Integer id, String name) {return null;}
}
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;@RestControllerAdvice
public class GlobalException {@ExceptionHandler(ConstraintViolationException.class)public ResponseEntity<Object> handleValidationExceptions(ConstraintViolationException ex) {Map<String, String> errors = new HashMap<>();Set<ConstraintViolation<?>> constraintViolations = ex.getConstraintViolations();for (ConstraintViolation<?> constraintViolation : constraintViolations) {String key = constraintViolation.getPropertyPath().toString();String message = constraintViolation.getMessage();errors.put(key, message);}// 這里可以根據(jù)實(shí)際需求定制返回的錯(cuò)誤信息結(jié)構(gòu)Map<String, Object> response = new HashMap<>();response.put("status", HttpStatus.BAD_REQUEST.value());response.put("errors", errors);return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);}
}
  • 校驗(yàn)寫在接口上的,拋出異常javax.validation.ConstraintViolationException
  • 校驗(yàn)寫在具體實(shí)現(xiàn),拋出異常javax.validation.ConstraintDeclarationException

注意點(diǎn)

代碼中國際化使用

  • 代碼里響應(yīng),手動(dòng)獲取使用MessageSource的getMessage方法即可,也就是spring容器中的getMessage()

  • # messages_en_US.properties
    welcome.message=Welcome to our website!# messages_zh_CN.properties
    welcome.message=歡迎來到我們的網(wǎng)站!#定義消息,并使用占位符{0}、{1}等表示參數(shù)位置
    #welcome.message=歡迎{0}來到{1}
  • //創(chuàng)建一個(gè)配置類來配置LocaleResolver,以便根據(jù)請(qǐng)求解析當(dāng)前的語言環(huán)境:
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.LocaleResolver;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    import org.springframework.web.servlet.i18n.SessionLocaleResolver;import java.util.Locale;@Configuration
    public class WebConfig implements WebMvcConfigurer {@Beanpublic LocaleResolver localeResolver() {SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();sessionLocaleResolver.setDefaultLocale(Locale.US); // 設(shè)置默認(rèn)語言return sessionLocaleResolver;}
    }
  • //創(chuàng)建一個(gè)控制器來使用國際化的消息
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.MessageSource;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
    import java.util.Locale;@RestController
    @RequestMapping("/hello")
    public class HelloController {@Autowiredprivate MessageSource messageSource;@GetMappingpublic String hello(HttpServletRequest request) {Locale locale = (Locale) request.getAttribute(org.springframework.web.servlet.LocaleResolver.LOCALE_RESOLVER_ATTRIBUTE);//messageSource.getMessage("welcome.message", new Object[]{"張三", "中國"}, Locale.CHINA)。return messageSource.getMessage("welcome.message", null, locale);}
    }

Locale獲取

默認(rèn)情況下spring注冊(cè)的messageSource對(duì)象為ResourceBundleMessageSource,會(huì)讀取spring.message配置。

請(qǐng)求中Locale的獲取是通過LocaleResolver進(jìn)行處理,默認(rèn)是AcceptHeaderLocaleResolver,通過WebMvcAutoConfiguration注入,從Accept-Language請(qǐng)求頭中獲取locale信息。

此時(shí)前端可以在不同語言環(huán)境時(shí)傳入不同的請(qǐng)求頭Accept-Language即可達(dá)到切換語言的效果

Accept-Language: en-Us
Accept-Language: zh-CN

默認(rèn)情況下前端請(qǐng)求中的不用處理,如果約定其他信息傳遞Local,使用自定義的I18nLocaleResolver替換默認(rèn)的AcceptHeaderLocaleResolver,重寫resolveLocale方法就可以自定義Locale的解析邏輯。

import cn.hutool.core.util.StrUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;/****/
@Configuration
public class I18nConfig {@Beanpublic LocaleResolver localeResolver() {return new I18nLocaleResolver();}/*** 獲取請(qǐng)求頭國際化信息* 使用自定義的I18nLocaleResolver替換默認(rèn)的AcceptHeaderLocaleResolver,重寫resolveLocale方法就可以自定義Locale的解析邏輯。** 自定義后使用content-language傳Locale信息,使用_劃分語言個(gè)地區(qū)。* content-language: en_US* content-language: zh_CN*/static class I18nLocaleResolver implements LocaleResolver {@Overridepublic Locale resolveLocale(HttpServletRequest httpServletRequest) {String language = httpServletRequest.getHeader("content-language");Locale locale = Locale.getDefault();if (StrUtil.isNotBlank(language)) {String[] split = language.split("_");locale = new Locale(split[0], split[1]);}return locale;}@Overridepublic void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {}}
}
http://www.risenshineclean.com/news/51564.html

相關(guān)文章:

  • 網(wǎng)站項(xiàng)目建設(shè)申請(qǐng)匯報(bào)大綱網(wǎng)絡(luò)營(yíng)銷推廣方案整合
  • 四網(wǎng)合一網(wǎng)站建設(shè)seo排名點(diǎn)擊軟件推薦
  • 個(gè)人新聞?lì)惥W(wǎng)站模板世界足球排名前100名
  • 體驗(yàn)好的網(wǎng)站陜西省人民政府
  • 互聯(lián)網(wǎng)行業(yè)環(huán)境分析seo博客
  • 網(wǎng)站備案要幕布照新手做銷售怎么開發(fā)客戶
  • 建網(wǎng)站公司seo技巧seo排名優(yōu)化
  • 網(wǎng)站建設(shè)賺錢嗎網(wǎng)站怎么快速排名
  • 昆明做網(wǎng)站建設(shè)價(jià)位50個(gè)市場(chǎng)營(yíng)銷經(jīng)典案例
  • 中信建設(shè)有限責(zé)任公司洪波頁優(yōu)化軟件
  • 番禺做網(wǎng)站平臺(tái)湖南競(jìng)價(jià)優(yōu)化專業(yè)公司
  • 做房產(chǎn)經(jīng)紀(jì)的那些網(wǎng)站可以進(jìn)客東莞網(wǎng)絡(luò)營(yíng)銷推廣軟件
  • 網(wǎng)站建設(shè)與管理代碼app開發(fā)價(jià)格表
  • h5游戲搭建優(yōu)化技術(shù)
  • 品牌網(wǎng)站模板百度指數(shù)如何分析
  • 站長(zhǎng)網(wǎng)站優(yōu)化公司手機(jī)網(wǎng)站建設(shè)價(jià)格
  • wordpress仿站難嗎廣東互聯(lián)網(wǎng)網(wǎng)絡(luò)營(yíng)銷推廣
  • 網(wǎng)站建設(shè)宗旨是什么口碑營(yíng)銷公司
  • 科技公司企業(yè)網(wǎng)站建設(shè)做一個(gè)企業(yè)網(wǎng)站大概需要多少錢
  • 營(yíng)銷型網(wǎng)站建設(shè)極速建站廣州網(wǎng)絡(luò)seo公司
  • 視頻下載網(wǎng)站軟件做副屏做網(wǎng)頁設(shè)計(jì)一個(gè)月能掙多少
  • 什么網(wǎng)站可以看女人唔易做網(wǎng)絡(luò)營(yíng)銷策劃書1500字
  • 做笑話網(wǎng)站常見的推廣方式
  • 免費(fèi)中文網(wǎng)站模板html關(guān)鍵詞排名哪里查
  • 手機(jī)點(diǎn)了釣魚網(wǎng)站怎么辦查詢網(wǎng)址域名ip地址
  • 廊坊網(wǎng)站制作公司小程序開發(fā)平臺(tái)有哪些
  • 個(gè)人網(wǎng)站可以做資訊小說類網(wǎng)絡(luò)優(yōu)化工程師是做什么的
  • 2017做那個(gè)網(wǎng)站能致富惠州seo關(guān)鍵字排名
  • 做彩平的材質(zhì)網(wǎng)站優(yōu)質(zhì)友情鏈接
  • c 網(wǎng)站開發(fā)的優(yōu)點(diǎn)建設(shè)網(wǎng)站推廣