Java一些过时方法与替换(不定时更新)
因为使用的jdk为11,所以大家会改到
var
这个弱类型,请注意
1. MediaType
jdk8已过时
/** @deprecated */
@Deprecated
public static final MediaType APPLICATION_JSON_UTF8;
/** @deprecated */
@Deprecated
public static final String APPLICATION_JSON_UTF8_VALUE = "application/json;charset=UTF-8";
替换jdk8
// 1.方式一 原有替换
public static final MediaType APPLICATION_JSON = new MediaType("application", "json");
public static final String APPLICATION_JSON_VALUE = "application/json";
// 2.方式二 自己创建
var mt = new MediaType("application", "json", StandardCharsets.UTF_8)
var APPLICATION_JSON_UTF8_VALUE = "application/json;charset=UTF-8";
2.SpringCloudGateway
新版本中过时
// 建议使用reactive方式的客户端发现
@Deprecated
public DiscoveryClientRouteDefinitionLocator(DiscoveryClient discoveryClient,
DiscoveryLocatorProperties properties) {
this(discoveryClient.getClass().getSimpleName(), properties);
serviceInstances = Flux
.defer(() -> Flux.fromIterable(discoveryClient.getServices()))
.map(discoveryClient::getInstances)
.subscribeOn(Schedulers.boundedElastic());
}
替换
public DiscoveryClientRouteDefinitionLocator(ReactiveDiscoveryClient discoveryClient,
DiscoveryLocatorProperties properties) {
this(discoveryClient.getClass().getSimpleName(), properties);
serviceInstances = discoveryClient.getServices()
.flatMap(service -> discoveryClient.getInstances(service).collectList());
}
3.ObjectMapper
在使用ObjectMapper做序列化的时候
var om = new ObjectMapper();
// 此方法以及过时
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
替换
// 和上面那个有相同的效果,但功能性更强
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
4. 反射获取对象(newInstance()
)
jdk9中过时
var a = Object.class;
// 此方法在jdk9过时.此方法传播null构造函数抛出的任何异常,包括已检查的异常。使用此方法有效地绕过了编译时异常,否则将由编译器执行检查.
var o = a.newInstance(); //get对象
替换
// 先初始化再获取对象
var o = a.getConstructor().newInstance();
5.dubbo
import org.apache.dubbo.config.annotation.Service;
@Service
import org.apache.dubbo.config.annotation.Reference;
@Reference
// 这两个注解在dubbo 2.7.0版本开始已经过时
替换
@DubboService
@DubboReference
6.ServletRequest
// 参数
HttpServletRequest request
// 方法
request.getRealPath("xxx");
替换
// 可以使用session方式
request.getSession().getServletContext().getRealPath(File.separator)
// 如果在Tomcat9、jdk1.8环境下可以用:
request.getServletContext().getRealPath(File.separator);
7.RedisConnectionFactory中创建
@Bean("RedisConnectionFactory")
public RedisConnectionFactory initRedisConnectionFactory() {
JedisPoolConfig poolConfig = new JedisPoolConfig();
//最大空 清数
poolConfig.setMaxIdle(30);
//最大连接数
poolConfig.setMaxTotal(50);
//最大等待毫秒数
poolConfig.setMaxWaitMillis(2000);
//创建 Jedis 连接工厂
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(poolConfig);
// 在spring-boot-data-2.0后过时
connectionFactory.setHostName("192.168.11.131");
connectionFactory.setPort(6379);
connectionFactory.setPassword("123456");
return connectionFactory;
}
替换
@Bean("RedisConnectionFactory")
public RedisConnectionFactory redisConnectionFactory() {
// 配制连接池
var config = new JedisPoolConfig();
config.setMaxIdle(30);
config.setMaxTotal(50);
config.setMaxWaitMillis(2000);
// 替换使用构造器方式
//获得默认的连接池构造器
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcb =
(JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
jpcb.poolConfig(config);
var jedisClientConfiguration = jpcb.build();
// 配制连接
String hostName = "127.0.0.1";
int port = 6379;
var redisStandaloneConfiguration = new RedisStandaloneConfiguration(hostName, port);
// 创建jedis连接工厂
return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
}
8.Springboot 集成Elasticsearch使用方式的改变
这次是对我使用的
spring-boot-starter-data-elasticsearch
版本更改后一些使用方式的改变所对应的是2.2.2->2.3.8的版本对应的es中6.84->7.6.2(7版本不再有type
)(实际过期时间有时间再补doge)。es6与es7的更改具体可以看官网(我写这个的时候已经7.11.0了,哈哈学不动了~)
连接
@Configuration
public class ElasticsearchTemplateConfig extends ElasticsearchConfigurationSupport {
@Bean
public Client elasticsearchClient() throws UnknownHostException {
var settings = Settings.builder().put("cluster.name", "elasticsearch").build();
var client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
return client;
}
@Bean(name = {"elasticsearchOperations", "elasticsearchTemplate"})
public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {
return new ElasticsearchTemplate(elasticsearchClient(),entityMapper());
}
@Bean
@Override
public EntityMapper entityMapper() {
var entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
new DefaultConversionService());
entityMapper.setConversions(elasticsearchCustomConversions());
return entityMapper;
}
}
替换
spring:
elasticsearch:
rest:
connection-timeout: 10s
uris: http://127.0.0.1:9200
模板类
@Resource
private ElasticsearchTemplate elasticsearchTemplate;
替换
// 之前的那个类已经不见了
@Resource
private ElasticsearchRestTemplate elasticsearchRestTemplate;
建言
// 设置completion属性
var tags = new CompletionSuggestionBuilder("tags")
.prefix(prefix)
.skipDuplicates(true);
// 设置suggest体
var suggestBuilder = new SuggestBuilder()
.addSuggestion("tags_suggest",tags);
// 指定_source
var searchRequestBuilder = elasticsearchTemplate.getClient()
.prepareSearch("news")//指定索引名
.suggest(suggestBuilder)
.setFetchSource(new String[]{"id"}, new String[]{});
// 底层List使用的泛型
var suggestList = searchRequestBuilder.get()
.getSuggest()
.getSuggestion("tags_suggest")
.getEntries();
替换
// 设置completion属性
var tags = new CompletionSuggestionBuilder("tags").prefix(prefix).skipDuplicates(true);
// 设置suggest体
var suggestBuilder = new SuggestBuilder().addSuggestion("tags_suggest", tags);
// 匹配资源
var sourceBuilder = new SearchSourceBuilder().suggest(suggestBuilder).fetchSource(new String[]{"id"}, new String[]{});
// 查询请求 多了一步构建查询请求并且设置source
var searchRequest = new SearchRequest("news").source(sourceBuilder);
// 查询建言 可以之前使用suggest()方法,但是设置不了source
var entries = elasticsearchRestTemplate
.execute(client -> client.search(searchRequest, RequestOptions.DEFAULT))
.getSuggest()
.getSuggestion("tags_suggest")
.getEntries();
分页
// searchQueryBuilder构建查询条件
AggregatedPage<EsDoc> page = elasticsearchTemplate.queryForPage(searchQueryBuilder, EsDoc.class,
new SearchResultMapper() {});
替换
// SearchHits封装了es返回数据 searchQueryBuilder构建查询条件
SearchHits<EsDoc> searchHits = elasticsearchRestTemplate.search(searchQueryBuilder, EsDoc.class);
未完