В этом выпуске java.net.URL#URL(java.lang.String) устарел. К сожалению, у меня есть класс, в котором я не нашел замены старому конструктору URL.
Код: Выделить всё
package com.github.bottomlessarchive.loa.url.service.encoder;
import io.mola.galimatias.GalimatiasParseException;
import org.springframework.stereotype.Service;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Optional;
/**
* This service is responsible for encoding existing {@link URL} instances to valid
* [url=https://en.wikipedia.org/wiki/Internationalized_Resource_Identifier]resource identifiers[/url].
*/
@Service
public class UrlEncoder {
/**
* Encodes the provided URL to a valid
* [url=https://en.wikipedia.org/wiki/Internationalized_Resource_Identifier]resource identifier[/url] and return
* the new identifier as a URL.
*
* @param link the url to encode
* @return the encoded url
*/
public Optional encode(final String link) {
try {
final URL url = new URL(link);
// We need to further validate the URL because the java.net.URL's validation is inadequate.
validateUrl(url);
return Optional.of(encodeUrl(url));
} catch (GalimatiasParseException | MalformedURLException | URISyntaxException e) {
return Optional.empty();
}
}
private void validateUrl(final URL url) throws URISyntaxException {
// This will trigger an URISyntaxException. It is needed because the constructor of java.net.URL doesn't always validate the
// passed url correctly.
new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
}
private URL encodeUrl(final URL url) throws GalimatiasParseException, MalformedURLException {
return io.mola.galimatias.URL.parse(url.toString()).toJavaURL();
}
}
Код: Выделить всё
package com.github.bottomlessarchive.loa.url.service.encoder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
class UrlEncoderTest {
private final UrlEncoder underTest = new UrlEncoder();
@ParameterizedTest
@CsvSource(
value = {
"http://www.example.com/?test=Hello world,http://www.example.com/?test=Hello%20world",
"http://www.example.com/?test=ŐÚőúŰÜűü,http://www.example.com/?test=%C5%90%C3%9A%C5%91%C3%BA%C5%B0%C3%9C%C5%B1%C3%BC",
"http://www.example.com/?test=random word £500 bank $,"
+ "http://www.example.com/?test=random%20word%20%C2%A3500%20bank%20$",
"http://www.aquincum.hu/wp-content/uploads/2015/06/Aquincumi-F%C3%BCzetek_14_2008.pdf,"
+ "http://www.aquincum.hu/wp-content/uploads/2015/06/Aquincumi-F%C3%BCzetek_14_2008.pdf",
"http://www.aquincum.hu/wp-content/uploads/2015/06/Aquincumi-F%C3%BCzetek_14 _2008.pdf,"
+ "http://www.aquincum.hu/wp-content/uploads/2015/06/Aquincumi-F%C3%BCzetek_14%20_2008.pdf"
}
)
void testEncodeWhenUsingValidUrls(final String urlToEncode, final String expected) throws MalformedURLException {
final Optional result = underTest.encode(urlToEncode);
assertThat(result)
.contains(new URL(expected));
}
@ParameterizedTest
@CsvSource(
value = {
"http://промкаталог.рф/PublicDocuments/05-0211-00.pdf"
}
)
void testEncodeWhenUsingInvalidUrls(final String urlToEncode) {
final Optional result = underTest.encode(urlToEncode);
assertThat(result)
.isEmpty();
}
}
Есть ли у кого-нибудь идеи о том, как я могу удалить новый URL-адрес (ссылка)< /code> фрагмент кода, сохраняя при этом функциональность?
Я пробовал разные вещи, например, используя java.net.URI#create, но это не дало точного результата, как предыдущее решение. Например, URL-адреса, содержащие незакодированные символы, такие как пробел в http://www.example.com/?test=Hello world, привели к возникновению исключения IllegalArgumentException. Это было проанализировано классом URL без ошибок (а мои данные содержат много таких ошибок). Кроме того, ссылки, URL-адрес которых не удалось преобразовать, например http://промкаталог.рф/PublicDocuments/05-0211-00.pdf, успешно преобразуются в URI с помощью URI.create.
Подробнее здесь: https://stackoverflow.com/questions/759 ... va-net-url
Мобильная версия