diff --git a/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java index 135398f025..75cb2d2151 100644 --- a/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java +++ b/epmet-gateway/src/main/java/com/epmet/filter/CpAuthGatewayFilterFactory.java @@ -72,7 +72,17 @@ public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory().error(e.getCode(),e.getMsg())); + } + }else{ + baseTokenDto = null; + } String customerId = ""; diff --git a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/feign/GovVoiceFeignClient.java b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/feign/GovVoiceFeignClient.java index f955e2b125..6a03cbafbc 100644 --- a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/feign/GovVoiceFeignClient.java +++ b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/feign/GovVoiceFeignClient.java @@ -36,48 +36,4 @@ public interface GovVoiceFeignClient { */ @PostMapping("/gov/voice/tag/tagcascadelist") Result> tagCascadeList(@RequestBody TagCascadeListFormDTO formDto); - - /** - * @Description 根据网格Id查找置顶文章的相关信息列表 用处:居民端首页轮播 - * @param commonArticleListFormDTO :: getGridId :: getNum - * @return List - * @author wangc - * @date 2020.06.02 16:13 - **/ - @PostMapping("/gov/voice/article/resitoparticlelist") - Result> resiTopArticleList(@RequestBody CommonArticleListFormDTO commonArticleListFormDTO); - - - - /** - * @Description 根据网格Id查找最新文章的相关信息列表 用处:居民端首页最新文章列表 - * @param commonArticleListFormDTO :: getGridId :: getNum - * @return List - * @author wangc - * @date 2020.06.03 09:53 - **/ - @PostMapping("/gov/voice/article/resilatestarticlelist") - Result> resiLatestArticleList(@RequestBody CommonArticleListFormDTO commonArticleListFormDTO); - - - /** - * @Description 根据网格Id和标签列表查找文章的相关信息列表 用处:居民端党建声音列表 - * @param articlePageFormDTO - * @return List - * @author wangc - * @date 2020.06.03 14:19 - **/ - @PostMapping("/gov/voice/article/resiarticlelist") - Result> resiArticleList(@RequestBody ArticlePageFormDTO articlePageFormDTO); - - /** - * @Description 根绝文章Id查询出文章的内容、封面等相关信息,如果居民端传入的网格Id不在该文章的发布范围内,则返回NULL - * @param articleDetailFormDTO - * @return ArticleDetailResultDTO - * @author wangc - * @date 2020.06.03 18:28 - **/ - @PostMapping("/gov/voice/article/resiarticledetail") - Result resiArticleDetail(@RequestBody ResiArticleDetailFormDTO articleDetailFormDTO); - } diff --git a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/feign/fallback/GovVoiceFeignClientFallBack.java b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/feign/fallback/GovVoiceFeignClientFallBack.java index 3e707a86f6..9e2c1eebba 100644 --- a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/feign/fallback/GovVoiceFeignClientFallBack.java +++ b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/dto/feign/fallback/GovVoiceFeignClientFallBack.java @@ -25,24 +25,4 @@ public class GovVoiceFeignClientFallBack implements GovVoiceFeignClient { public Result> tagCascadeList(TagCascadeListFormDTO formDto) { return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "tagCascadeList", formDto); } - - @Override - public Result> resiTopArticleList(CommonArticleListFormDTO commonArticleListFormDTO) { - return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "resiTopArticleList", commonArticleListFormDTO); - } - - @Override - public Result> resiLatestArticleList(CommonArticleListFormDTO commonArticleListFormDTO) { - return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "resiLatestArticleList", commonArticleListFormDTO); - } - - @Override - public Result> resiArticleList(ArticlePageFormDTO articlePageFormDTO) { - return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "resiArticleList", articlePageFormDTO); - } - - @Override - public Result resiArticleDetail(ResiArticleDetailFormDTO articleDetailFormDTO) { - return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "resiArticleDetail", articleDetailFormDTO); - } } diff --git a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/feign/GovVoiceOpenFeignClient.java b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/feign/GovVoiceOpenFeignClient.java index 1c906ef6a3..eb9cf4c240 100644 --- a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/feign/GovVoiceOpenFeignClient.java +++ b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/feign/GovVoiceOpenFeignClient.java @@ -2,8 +2,19 @@ package com.epmet.feign; import com.epmet.commons.tools.constant.ServiceConstant; -import com.epmet.dto.feign.fallback.GovVoiceFeignClientFallBack; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.form.ArticlePageFormDTO; +import com.epmet.dto.form.CommonArticleListFormDTO; +import com.epmet.dto.form.ResiArticleDetailFormDTO; +import com.epmet.dto.result.ArticleBannerResultDTO; +import com.epmet.dto.result.ArticleDetailResultDTO; +import com.epmet.dto.result.ArticleLatestResultDTO; +import com.epmet.dto.result.ArticleListResultDTO; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; /** * 本服务对外开放的API,其他服务通过引用此client调用该服务 @@ -11,8 +22,51 @@ import org.springframework.cloud.openfeign.FeignClient; * @author yinzuomei@elink-cn.com * @date 2020/6/4 16:01 */ -@FeignClient(name = ServiceConstant.GOV_VOICE_SERVER, fallback = GovVoiceFeignClientFallBack.class) +@FeignClient(name = ServiceConstant.GOV_VOICE_SERVER, fallback = GovVoiceOpenFeignClientFallback.class) public interface GovVoiceOpenFeignClient { + /** + * @Description 根据网格Id查找置顶文章的相关信息列表 用处:居民端首页轮播 + * @param commonArticleListFormDTO :: getGridId :: getNum + * @return List + * @author wangc + * @date 2020.06.02 16:13 + **/ + @PostMapping("/gov/voice/article/resitoparticlelist") + Result> resiTopArticleList(@RequestBody CommonArticleListFormDTO commonArticleListFormDTO); + + + + /** + * @Description 根据网格Id查找最新文章的相关信息列表 用处:居民端首页最新文章列表 + * @param commonArticleListFormDTO :: getGridId :: getNum + * @return List + * @author wangc + * @date 2020.06.03 09:53 + **/ + @PostMapping("/gov/voice/article/resilatestarticlelist") + Result> resiLatestArticleList(@RequestBody CommonArticleListFormDTO commonArticleListFormDTO); + + + /** + * @Description 根据网格Id和标签列表查找文章的相关信息列表 用处:居民端党建声音列表 + * @param articlePageFormDTO + * @return List + * @author wangc + * @date 2020.06.03 14:19 + **/ + @PostMapping("/gov/voice/article/resiarticlelist") + Result> resiArticleList(@RequestBody ArticlePageFormDTO articlePageFormDTO); + + /** + * @Description 根绝文章Id查询出文章的内容、封面等相关信息,如果居民端传入的网格Id不在该文章的发布范围内,则返回NULL + * @param articleDetailFormDTO + * @return ArticleDetailResultDTO + * @author wangc + * @date 2020.06.03 18:28 + **/ + @PostMapping("/gov/voice/article/resiarticledetail") + Result resiArticleDetail(@RequestBody ResiArticleDetailFormDTO articleDetailFormDTO); + } diff --git a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/feign/GovVoiceOpenFeignClientFallback.java b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/feign/GovVoiceOpenFeignClientFallback.java index daf8abaa7f..16b020b732 100644 --- a/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/feign/GovVoiceOpenFeignClientFallback.java +++ b/epmet-module/gov-voice/gov-voice-client/src/main/java/com/epmet/feign/GovVoiceOpenFeignClientFallback.java @@ -1,7 +1,19 @@ package com.epmet.feign; +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.utils.ModuleUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.dto.form.ArticlePageFormDTO; +import com.epmet.dto.form.CommonArticleListFormDTO; +import com.epmet.dto.form.ResiArticleDetailFormDTO; +import com.epmet.dto.result.ArticleBannerResultDTO; +import com.epmet.dto.result.ArticleDetailResultDTO; +import com.epmet.dto.result.ArticleLatestResultDTO; +import com.epmet.dto.result.ArticleListResultDTO; import org.springframework.stereotype.Component; +import java.util.List; + /** * 本服务对外开放的API,其他服务通过引用此client调用该服务 * @@ -10,4 +22,24 @@ import org.springframework.stereotype.Component; */ @Component public class GovVoiceOpenFeignClientFallback implements GovVoiceOpenFeignClient{ + + @Override + public Result> resiTopArticleList(CommonArticleListFormDTO commonArticleListFormDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "resiTopArticleList", commonArticleListFormDTO); + } + + @Override + public Result> resiLatestArticleList(CommonArticleListFormDTO commonArticleListFormDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "resiLatestArticleList", commonArticleListFormDTO); + } + + @Override + public Result> resiArticleList(ArticlePageFormDTO articlePageFormDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "resiArticleList", articlePageFormDTO); + } + + @Override + public Result resiArticleDetail(ResiArticleDetailFormDTO articleDetailFormDTO) { + return ModuleUtils.feignConError(ServiceConstant.GOV_VOICE_SERVER, "resiArticleDetail", articleDetailFormDTO); + } } diff --git a/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/controller/VoiceController.java b/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/controller/VoiceController.java index da34a9f1e0..16a9774f59 100644 --- a/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/controller/VoiceController.java +++ b/epmet-module/resi-home/resi-home-server/src/main/java/com/epmet/controller/VoiceController.java @@ -2,10 +2,10 @@ package com.epmet.controller; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; -import com.epmet.dto.feign.GovVoiceFeignClient; import com.epmet.dto.form.CommonArticleListFormDTO; import com.epmet.dto.result.ArticleBannerResultDTO; import com.epmet.dto.result.ArticleLatestResultDTO; +import com.epmet.feign.GovVoiceOpenFeignClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -19,7 +19,7 @@ import java.util.List; public class VoiceController { @Autowired - private GovVoiceFeignClient govVoiceFeignClient; + private GovVoiceOpenFeignClient govVoiceFeignClient; /** * @Description 根据网格Id查找置顶文章的相关信息列表 用处:居民端首页轮播 diff --git a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/ArticlePageFormDTO.java b/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/ArticlePageFormDTO.java deleted file mode 100644 index f15a296854..0000000000 --- a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/ArticlePageFormDTO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.epmet.dto.form; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; -import java.util.List; - -/** - * @Description 居民端查看文章列表参数DTO - * @ClassName ArticlePageFormDTO - * @Auth wangc - * @Date 2020-06-03 14:21 - */ - -@Data -public class ArticlePageFormDTO implements Serializable { - private static final long serialVersionUID = -6201259689082896334L; - - public interface ArticlePageInternalGroup{} - - /** - * 网格Id - * */ - @NotBlank(message = "网格Id不能为空" , groups = {ArticlePageInternalGroup.class}) - private String gridId; - - /** - * 标签Id集合 - * */ - private List tagIdList; - - /** - * 页码 - * */ - private Integer pageNo = 1; - - /** - * 每页显示量 - * */ - private Integer pageSize = 10; - -} diff --git a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/CommonArticleListFormDTO.java b/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/CommonArticleListFormDTO.java deleted file mode 100644 index 5602cabf48..0000000000 --- a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/CommonArticleListFormDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.epmet.dto.form; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; - -/** - * @Description 居民端首页轮播查询接口DTO - * @ClassName ArticleBannerFormDTO - * @Auth wangc - * @Date 2020-06-02 11:20 - */ -@Data -public class CommonArticleListFormDTO implements Serializable { - private static final long serialVersionUID = 5996259506950697451L; - - /** - * 内部错误分组 - * */ - public interface ArticleBannerInternalGroup{} - - /** - * 网格Id - * */ - @NotBlank(message = "网格Id不能为空" , groups = {ArticleBannerInternalGroup.class}) - private String gridId; - - /** - * 客户定制化条数(高级配置里的参数) - * */ - private Integer num; - -} diff --git a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/ResiArticleDetailFormDTO.java b/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/ResiArticleDetailFormDTO.java deleted file mode 100644 index 87de7f5045..0000000000 --- a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/form/ResiArticleDetailFormDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.epmet.dto.form; - -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; - -/** - * @Description 居民端查看文章详情传参DTO - * @ClassName ResiArticleDetailFormDTO - * @Auth wangc - * @Date 2020-06-04 09:20 - */ -@Data -public class ResiArticleDetailFormDTO implements Serializable { - private static final long serialVersionUID = -7197489284630455909L; - - public interface ResiArticleDetailInternalGroup{} - - /** - * 网格Id - * */ - @NotBlank(message = "网格Id不能为空",groups = ResiArticleDetailInternalGroup.class) - private String gridId; - - /** - * 文章Id - * */ - @NotBlank(message = "文章Id不能为空",groups = ResiArticleDetailInternalGroup.class) - private String articleId; - - /** - * 用户Id - * */ - @NotBlank(message = "用户Id不能为空",groups = ResiArticleDetailInternalGroup.class) - private String userId; -} diff --git a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleContentResultDTO.java b/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleContentResultDTO.java deleted file mode 100644 index 9b12f89213..0000000000 --- a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleContentResultDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.epmet.dto.result; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @Description - * @ClassName ArticleContentResultDTO - * @Auth wangc - * @Date 2020-06-03 16:41 - */ -@Data -public class ArticleContentResultDTO implements Serializable { - private static final long serialVersionUID = 2853197212163051558L; - - /** - * 内容类型(图片:img;文字:text) - * */ - private String contentType; - - /** - * 内容 - * */ - private String content; -} diff --git a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleDetailResultDTO.java b/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleDetailResultDTO.java deleted file mode 100644 index 30adfb5e3e..0000000000 --- a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleDetailResultDTO.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.epmet.dto.result; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - * @Description - * @ClassName ArticleDetailResultDTO - * @Auth wangc - * @Date 2020-06-03 16:36 - */ -@JsonIgnoreProperties(ignoreUnknown = true) -@Data -public class ArticleDetailResultDTO implements Serializable { - private static final long serialVersionUID = 4659147595194692686L; - - /** - * 文章Id - * */ - private String articleId; - - /** - * 文章标题 - * */ - private String articleTitle; - - /** - * 文章发布单位名称 - * */ - private String publishUnitDesc; - - /** - * 发布时间 - * */ - private String publishDate; - - /** - * 文章当前网格阅读量(article_visit_record统计数) - * */ - private Integer visitRecordCount; - - /** - * 标签名称集合(竖线分隔) - * */ - private String tags; - - /** - * 文章内容 - * */ - private List articleContentList; - -} diff --git a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleListResultDTO.java b/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleWithTagsResultDTO.java similarity index 69% rename from epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleListResultDTO.java rename to epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleWithTagsResultDTO.java index 04d4f14a27..9b55cf2d13 100644 --- a/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleListResultDTO.java +++ b/epmet-module/resi-voice/resi-voice-client/src/main/java/com/epmet/dto/result/ArticleWithTagsResultDTO.java @@ -3,16 +3,17 @@ package com.epmet.dto.result; import lombok.Data; import java.io.Serializable; +import java.util.Set; /** * @Description - * @ClassName ArticleListResultDTO + * @ClassName ArticleWithTagsResultDTO * @Auth wangc - * @Date 2020-06-03 10:59 + * @Date 2020-06-04 16:53 */ @Data -public class ArticleListResultDTO implements Serializable { - private static final long serialVersionUID = 293527138997974861L; +public class ArticleWithTagsResultDTO implements Serializable { + private static final long serialVersionUID = 2877103226476707681L; /** * 文章Id * */ @@ -41,6 +42,5 @@ public class ArticleListResultDTO implements Serializable { /** * 标签名称集合(竖线分隔) * */ - private String tagName; - + private Set tagName; } diff --git a/epmet-module/resi-voice/resi-voice-server/src/main/java/com/epmet/controller/ArticleController.java b/epmet-module/resi-voice/resi-voice-server/src/main/java/com/epmet/controller/ArticleController.java index 4a21402b45..346549afd2 100644 --- a/epmet-module/resi-voice/resi-voice-server/src/main/java/com/epmet/controller/ArticleController.java +++ b/epmet-module/resi-voice/resi-voice-server/src/main/java/com/epmet/controller/ArticleController.java @@ -7,6 +7,7 @@ import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.dto.feign.GovVoiceFeignClient; import com.epmet.dto.form.*; import com.epmet.dto.result.*; +import com.epmet.feign.GovVoiceOpenFeignClient; import com.epmet.service.ArticleService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; @@ -23,7 +24,7 @@ public class ArticleController { @Autowired private ArticleService articleService; @Autowired - private GovVoiceFeignClient govVoiceFeignClient; + private GovVoiceOpenFeignClient govVoiceOpenFeignClient; /** * @Description 首页标签及更多——居民端 @@ -73,7 +74,7 @@ public class ArticleController { public Result articleDetail(@LoginUser TokenDto tokenDto,@RequestBody ResiArticleDetailFormDTO articleDetailFormDTO){ articleDetailFormDTO.setUserId(tokenDto.getUserId()); ValidatorUtils.validateEntity(articleDetailFormDTO,ResiArticleDetailFormDTO.ResiArticleDetailInternalGroup.class); - return govVoiceFeignClient.resiArticleDetail(articleDetailFormDTO); + return govVoiceOpenFeignClient.resiArticleDetail(articleDetailFormDTO); } } diff --git a/epmet-module/resi-voice/resi-voice-server/src/main/java/com/epmet/service/impl/ArticleServiceImpl.java b/epmet-module/resi-voice/resi-voice-server/src/main/java/com/epmet/service/impl/ArticleServiceImpl.java index 27eb5433d6..dad9543720 100644 --- a/epmet-module/resi-voice/resi-voice-server/src/main/java/com/epmet/service/impl/ArticleServiceImpl.java +++ b/epmet-module/resi-voice/resi-voice-server/src/main/java/com/epmet/service/impl/ArticleServiceImpl.java @@ -12,6 +12,7 @@ import com.epmet.dto.form.TagCascadeListFormDTO; import com.epmet.dto.result.ArticleListResultDTO; import com.epmet.dto.result.ArticleWithTagsResultDTO; import com.epmet.dto.result.TagInfoResultDTO; +import com.epmet.feign.GovVoiceOpenFeignClient; import com.epmet.service.ArticleService; import com.epmet.utils.ModuleConstant; import org.apache.commons.lang3.StringUtils; @@ -34,6 +35,8 @@ public class ArticleServiceImpl implements ArticleService { @Autowired private GovVoiceFeignClient govVoiceFeignClient; + @Autowired + private GovVoiceOpenFeignClient govVoiceOpenFeignClient; /** * @Description 首页标签及更多——居民端 @@ -67,7 +70,7 @@ public class ArticleServiceImpl implements ArticleService { **/ @Override public List articleList(ArticlePageFormDTO articlePageFormDTO) { - Result> articles = govVoiceFeignClient.resiArticleList(articlePageFormDTO); + Result> articles = govVoiceOpenFeignClient.resiArticleList(articlePageFormDTO); if(articles.success() && null != articles.getData() && articles.getData().size() > NumConstant.ZERO){ return articles.getData().stream().map(article -> { ArticleWithTagsResultDTO artObj = ConvertUtils.sourceToTarget(article,ArticleWithTagsResultDTO.class);