Ця програма не має явного відображення для / помилки


108

Я використовував Maven, щоб зробити підручник https://spring.io/guides/gs/uploading-files/
Усі коди, які я використовував, були скопійовані.

Додаток може працювати, але я отримую помилку:

Сторінка помилок Whitelabel У цій програмі немає чіткого відображення / помилки, тому ви бачите це як резервний. Чт 30 червня 17:24:02 CST 2015 Виникла несподівана помилка (тип = Не знайдено, статус = 404). Немає повідомлень

Як я можу це виправити?


додав ваш коментар до публікації - ви можете їх редагувати самостійно. Це краще, ніж коментувати свій власний пост
Олександр

Відповіді:


137

Переконайтеся, що ваш основний клас знаходиться в кореневому пакеті над іншими класами.

Коли ви запускаєте додаток Spring Boot (тобто клас, позначений за допомогою @SpringBootApplication), Spring буде сканувати лише класи нижче вашого основного пакету класів.

com
   +- APP
         +- Application.java  <--- your main class should be here, above your controller classes
         |
         +- model
         |   +- user.java
         +- controller
             +- UserController.java

4
Вище чи на одному рівні?
Мартін Ерлік

21
Я витратив майже 2 години свого життя на з'ясування цього!
Ракеш

7
Спробував це теж. Все ж помилка. Принаймні на головній сторінці, тобто localhost: 8080 повинен показати мені домашню сторінку Tomcat, чи не так? Але це теж не відображається
zulkarnain shah

Дякую за підказку. Раніше я був користувачем Eclipse, і там ця конфігурація не потрібна, але зараз я використовую IntelliJ, і це було дуже сподівано.
Армер Б.

@zulkarnainshah Звичайна домашня сторінка tomcat генерується ВІЙНЕЮ, яка тут не включена.
Thorbjørn Ravn Andersen

61

Коли ми створюємо додаток для завантаження Spring, ми коментуємо його @SpringBootApplicationанотацією. Ця анотація "завершує" багато інших необхідних приміток для роботи програми. Однією з таких анотацій є @ComponentScanанотація. Ця примітка вказує Spring шукати компоненти Spring та налаштовувати програму на запуск.

Ваш клас додатків повинен бути вище ієрархії ваших пакетів, щоб Spring міг сканувати підпакети та знаходити інші необхідні компоненти.

package com.test.spring.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

Нижче фрагмент коду працює як пакет контролера знаходиться під com.test.spring.bootпакетом

package com.test.spring.boot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @RequestMapping("/")
    public String home(){
        return "Hello World!";
    }
}

Нижче фрагмент коду НЕ працює, оскільки пакет контролера НЕ знаходиться під com.test.spring.bootпакетом

package com.test.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

     @RequestMapping("/")
     public String home(){
         return "Hello World!";
     }
 }

З документації до весняного завантаження:

Багато розробники Spring Завантажувального завжди мають свій основний клас з анотацією @Configuration, @EnableAutoConfigurationі @ComponentScan. Оскільки ці анотації настільки часто використовуються разом (особливо якщо ви дотримуєтесь кращих практик вище), Spring Boot є зручною @SpringBootApplicationальтернативою.

@SpringBootApplicationАнотація еквівалентно використання @Configuration, @EnableAutoConfigurationі @ComponentScanз їх атрибутами по замовчуванням


3
Дуже приємне пояснення. Дякую
Лова Чіттумурі

39

Вирішити це можна, додавши ErrorControllerу свою заявку. Ви можете змусити контролер помилок повернути потрібний вам вид.

Контролер помилок у моїй програмі виглядає нижче:

import org.springframework.boot.autoconfigure.web.ErrorAttributes;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * Basic Controller which is called for unhandled errors
 */
@Controller
public class AppErrorController implements ErrorController{

    /**
     * Error Attributes in the Application
     */
    private ErrorAttributes errorAttributes;

    private final static String ERROR_PATH = "/error";

    /**
     * Controller for the Error Controller
     * @param errorAttributes
     */
    public AppErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    /**
     * Supports the HTML Error View
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH, produces = "text/html")
    public ModelAndView errorHtml(HttpServletRequest request) {
        return new ModelAndView("/errors/error", getErrorAttributes(request, false));
    }

    /**
     * Supports other formats like JSON, XML
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes(request, getTraceParameter(request));
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }

    /**
     * Returns the path of the error page.
     *
     * @return the error path
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }


    private boolean getTraceParameter(HttpServletRequest request) {
        String parameter = request.getParameter("trace");
        if (parameter == null) {
            return false;
        }
        return !"false".equals(parameter.toLowerCase());
    }

    private Map<String, Object> getErrorAttributes(HttpServletRequest request,
                                                   boolean includeStackTrace) {
        RequestAttributes requestAttributes = new ServletRequestAttributes(request);
        return this.errorAttributes.getErrorAttributes(requestAttributes,
                includeStackTrace);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request
                .getAttribute("javax.servlet.error.status_code");
        if (statusCode != null) {
            try {
                return HttpStatus.valueOf(statusCode);
            }
            catch (Exception ex) {
            }
        }
        return HttpStatus.INTERNAL_SERVER_ERROR;
    }
}

Вищевказаний клас заснований на класі Springs BasicErrorController .

Ви можете описати вищезазначене ErrorControllerу @Configurationфайлі:

 @Autowired
 private ErrorAttributes errorAttributes;

 @Bean
 public AppErrorController appErrorController(){return new AppErrorController(errorAttributes);}

Ви можете обрати заміну за замовчуванням ErrorAttributes, застосувавши ErrorAttributes . Але в більшості випадків DefaultErrorAttributes повинно вистачити.


1
Ваше посилання на BasicErrorControllerклас 404.
Стефан

@owaism: Посилання BasicErrorControllerвже не є хорошою, ви можете оновити?
HDJEMAI

1
Зараз посилання на BasicErrorControllerвиправлено.
аксіопісти

15

У моєму випадку клас контролера був позначений @Controller. Змінивши це, щоб @RestControllerвирішити проблему. В основному, так @RestControllerце @Controller + @ResponseBody або використовувати @RestController, або @Controllerз @ResponseBodyанотацією до кожного методу.

Деякі корисні примітки тут: https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/


Це працює, але, як показано в прикладах, у всій Інтернеті основна конфігурація повинна працювати з @Controller. Будь-який орган знає про цю причину, чому працює лише RestController?
супернова

Коли анотування вашого класу за допомогою @RestControllerнього неявно додається @ResponseBodyпримітка, але якщо ви використовуєте @Controllerпримітку, ви повинні явно додати цю примітку самостійно.
Робін Кескісарка

10

в моєму випадку це через положення пакета, тобто пакет контролера повинен бути вище пакету основного класу

якщо мій основний пакет - це package co.companyname.spring.tutorial;будь-який пакет контролерівpackage co.companyname.spring.tutorial.WHAT_EVER_HERE;

package co.companyname.spring.tutorial; // package for main class
@SpringBootApplication
public class FirstProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(FirstProjectApplication.class, args);
    }
}


package co.companyname.spring.tutorial.controllers; // package for controllers 

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController 
public class HelloController { 

@RequestMapping("/hello")  
public String hello() {   
 return "Hello, world"; 
 }}

після закінчення кодування натисніть на панель приладів завантаження

введіть тут опис зображення

остання річ, щоб переконатися, що ваш контролер відображає карту чи не лише консоль, ви повинні побачити щось усміхнене

Mapped "{[/hello]}" onto public java.lang.String co.companyname.spring.tutorial.controllers.HelloController.hello()

щасливе кодування


9

Це відбувається, коли явна сторінка помилки не визначена. Щоб визначити сторінку помилки, створіть відображення / помилку з видом. наприклад, наведений нижче код вказує на значення рядка, що повертається у разі помилки.

package com.rumango.controller;

import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController implements ErrorController{
    private final static String PATH = "/error";
    @Override
    @RequestMapping(PATH)
    @ResponseBody
    public String getErrorPath() {
        // TODO Auto-generated method stub
        return "No Mapping Found";
    }

}

Чи можете ви додати якесь пояснення до свого коду? Чому це вирішує питання, які є вирішальними частинами?
Ніко Хааз

Є одна конкретна річ, яку слід зазначити у цій відповіді щодо Spring Boot, яка спочатку викликала у мене трохи головний біль. Важливо реалізувати інтерфейс ErrorController Springframework. Якщо ви створите кінцеву точку контролера, зіставлену на "/ error", не роблячи цього, ви отримаєте помилку, повідомивши, що метод вже відображений.
mmaynar1

8

Спробуйте додати залежність.

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

2
що це насправді робить?
Стелс-раббі

Я додав цю залежність, і вона спрацювала. Як і @StealthRabbi ... Мені теж цікаво, що це насправді робить.
twindham

@StealthRabbi Це додає залежність до шаблонного шаблону під назвою Thymeleaf, який є альтернативою та кращим підходом до JSP. Ця відповідь не є справжньою відповіддю, тому, що подолати залежність не допоможе нікому, хто насправді зацікавлений в основному питанні
Крістіан,

5

Я додав цю залежність і це вирішило мою проблему.

<dependency>
    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Ось моя теорія: Якщо ми використовуємо "@Controller", якимось чином Spring би вимагав від нас певного механізму роботи з шаблонами. І в цьому випадку Чебрець. Тому потрібна весняна черевик-закваска-чебрець. Тоді як якщо ми використовуємо "@RestController", Spring Boot не потребує механізму роботи з шаблонами. А отже, це працює і без чебрецю.
Йосі Прамаяя

4

Я розробляю додаток Spring Boot протягом декількох тижнів. І я отримав таку ж помилку, як нижче;

Сторінка помилок Whitelabel У цій програмі немає чіткого відображення / помилки, тому ви бачите це як резервний. Чт 18 січня 14:12:11 AST 2018 Виникла несподівана помилка (тип = Не знайдено, статус = 404). Немає повідомлень

Коли я отримую цей масаж помилок, я зрозумів, що в моєму проекті визначено клас контролера чи спокою. Я маю на увазі, що всі наші пакети контролерів не є тим самим пакетом з основним класом, який включає анотацію @SpringBootApplication. Я маю на увазі, що вам потрібно додати ім’я пакета контролера до анотації @ComponentScan до вашого основного класу, який включає @SpringBootApplication annotation.Якщо ви пишете коди знизу ваша проблема буде вирішуватися ... Найголовніше, що ви повинні додати свій пакет усіх контролерів до анотації @ComponentScan, як я це робив у наведеному нижче

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan({ "com.controller.package1, com.controller.package2, com.controller.package3, com.controller.packageN", "controller", "service" } // If our Controller class or Service class is not in the same packages we have //to add packages's name like this...directory(package) with main class
public class MainApp {
    public static void main(String[] args) {
        SpringApplication.run(MainApp.class, args);
    }
}

Я сподіваюся, що ці коди комусь допоможуть ...

Якщо ви знайдете інший спосіб вирішити цю помилку або у вас є якісь пропозиції щодо мене, напишіть до коментарів ... дякую ...


4

У головному класі після конфігурації "@SpringBootApplication", додавши "@ComponentScan", не маючи жодних аргументів, для мене працювали !!!

Основний клас:

@SpringBootApplication
@ComponentScan
public class CommentStoreApplication {

    public static void main(String[] args) {
        SpringApplication.run(CommentStoreApplication.class, args);

    }
}

Клас RestController:

@RestController
public class CommentStoreApp {

    @RequestMapping("/") 
    public String hello() {
        return "Hello World!";
    }
}

PS: Перед запуском програми не забувайте запускати команди mvn clean та mvn install


4

Досить пізно на вечірку. Відповідно до офіційної документації весни "Spring Boot встановлює сторінку помилки з Whitelabel, яку ви бачите у клієнта браузера, якщо ви зіткнулися з помилкою сервера." https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-customize-the-whitelabel-error-page

  1. Ви можете відключити цю функцію, встановивши server.error.whitelabel.enabled=falseу application.yml або файл application.properties .

2. Рекомендованим способом є встановлення вашої сторінки помилок, щоб кінцевий користувач міг зрозуміти. У папці ресурсів / шаблонів створіть файл error.html та додайте залежність у файл pom.xml

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

Spring автоматично вибере сторінку error.html як шаблон помилки за замовчуванням. Примітка: - Не забудьте оновити проект maven після додавання залежності.


3

Можливо, ви отримуєте помилку, тобто

"У цій програмі немає явного відображення для помилки / помилки, тож ви бачите це як резервне".

Це тому, що це не сканування ваших класів Controller & Service, які потрібно вказати у вашому головному () класі, як це,

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableAutoConfiguration
**@ComponentScan({"com.example.demo", "controller", "service"})**
public class SpringBootMvcExample1Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootMvcExample1Application.class, args);
    }
}

Примітка. Тут я вказав різні класи, такі як демо, контролер та сервіс, які потрібно відсканувати, лише тоді він буде працювати належним чином.


3

Ви повинні організувати пакунки так, щоб пакунок, що містить загальнодоступний статичний основний (або де ви написали @SpringBootApplication), був батьком усіх ваших інших пакетів.


- com.mypackage + nameApplication.java - com.mypachage.model - com.mypachage.controller - com.mypachage.dao
sakgeek

3

За замовчуванням весняний завантажувач сканує поточний пакет для визначення бобу. Отже, якщо ваш поточний пакет, де визначено основний клас, а пакет контролера не є однаковим, або пакет контролера не є дочірнім пакетом вашого основного пакета програм, він не сканує контролер. Для вирішення цього питання можна включити список пакунків для визначення квасолі в основний пакет

@SpringBootApplication(scanBasePackages = {"com.module.restapi1.controller"})

або створити ієрархію пакунків, де дочірній пакет походить від основного пакету

package com.module.restapi;
package com.module.restapi.controller

2

Проблема полягає в тому, що ви переходите до localhost: 8080 / замість localhost: 8080 / завантажуйте так, як це визначено в посібнику. Spring Boot має сторінку помилок за замовчуванням, яка використовується під час переходу до не визначеного маршруту, щоб уникнути надання конкретних даних сервера (що може розглядатися як ризик безпеки).

Можна вибрати: перейти на потрібну сторінку, додати власну цільову сторінку або замінити білу сторінку з помилками .

Щоб спростити цю конкретну ситуацію, я оновив керівництво, щоб воно використовувало / замість / завантажувало.


2

Я знаю, що це не зовсім відповідь на питання, але це питання спочатку з’являється в Google :)

Проблема ("У цієї програми немає явного відображення для помилки / помилки") з'являється при спробі отримати доступ до інтерфейсу Swagger.

У моєму випадку проблеми були викликані @RestController ("/ кінцева точка"), яка не обробляється належним чином.

Отже, це призвело до помилок:

@RestController("/endpoint")
public class EndpointController {

І це було чудово

@RestController
@RequestMapping("/endpoint")
public class EndpointController {

2

це може статися, якщо ви забудете анотацію @RestController поверх класу контролера імпорту імпорту org.springframework.web.bind.annotation.RestController;

і додайте примітку, як показано нижче

див. простий приклад нижче

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;


@RestController
public class HelloController {
@RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

1

Змініть @Controller на @RestController у своєму класі контролерів, і все повинно проходити гладко.


1

Я теж отримав ту саму помилку і зміг усунути помилку, додавши нижче залежність до мого pom.xml.

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

Причина в тому, що ми використовуємо JSP в якості перегляду. Типовим вбудованим контейнером сервлетів для Веб-завантажувача Spring Boot є tomcat. Щоб увімкнути підтримку JSP, нам потрібно було б додати залежність від tomcat-embed-jasper.

У моєму випадку я повертав JSP як погляд з контролера. Сподіваюся, що ця відповідь допомагає тому, хто бореться з тим же питанням.


1

Я зіткнувся з тією ж проблемою, використовуючи gradle, і він вирішився, додавши наступні залежності -

compile('org.springframework.boot:spring-boot-starter-data-jpa')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
compile('org.apache.tomcat.embed:tomcat-embed-jasper')

раніше я бракував останнього, що спричинило ту саму помилку.


У мене була така ж проблема, і мені не вистачало плагіна tomcat-embed-jasper у pom.xml. І tomcat-embed-jasper важливий для надання jsp.
rinilnath

boraji.com/… , це призвело до виявлення того, що відсутній
жасман

1

Я зіткнувся з цим питанням, а потім зрозумів, що мені не вистачає @Configurationанотації в MvcConfigкласі, що в основному робить відображення для ViewControllersі setViewNames.

Ось вміст файлу:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
**@Configuration**
public class MvcConfig implements WebMvcConfigurer{
   public void addViewControllers(ViewControllerRegistry registry)
   {
      registry.addViewController("/").setViewName("login");
      registry.addViewController("/login").setViewName("login");
      registry.addViewController("/dashboard").setViewName("dashboard");
   }
}

Сподіваюся, це допомагає комусь !!


Це зробило це для мене.
Ентоні Окот

1

Переконайтеся, що у списку залежностей є яшма та jstl:

<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

Ось робочий проект для початківців - https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-jsp

Автор: Biju Kunjummen


1

Мені потрібно згадати цей спосіб і навести посилання на пакети, і це склалося. Ви можете виключити @EnableAutoConfigurationцю примітку, але потрібну мені, щоб обійти будь-які залежності, пов’язані з БД.

@SpringBootApplication
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
@ComponentScan(basePackages = {"your package 1", "your package2"})

public class CommentStoreApplication {

    public static void main(String[] args) {
        SpringApplication.run(CommentStoreApplication.class, args);

    }
}

1

Основний клас повинен знаходитись поза структурою дерева ваших пакетів програм. Наприклад: приклад


0

Все, що я зробив, щоб вирішити подібну проблему, це згадати анотацію @Configuration в класі MVCConfig.

Як ця:

package com.example;

/**
 * Created by sartika.s.hasibuan on 1/10/2017.
 */
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@EnableAutoConfiguration
@Configuration
@ComponentScan
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}

0

У мене була подібна помилка, я використовую весняний завантажувач та швидкість, моє рішення - перевірити файл application.properties, spring.velocity.toolbox-config-location, виявило, що ця властивість невірна


0

У моєму випадку ця проблема виникає при запуску SpringApplication зсередини IntelliJ після її запуску спочатку з maven.

Щоб вирішити проблему, я бігаю першим mvn clean. Потім я запускаю SpringApplication з IntelliJ.


0

Переконайтесь, що ваш головний. клас повинен бути над вашими контролерами. У разі наступного прикладу:

Main.class, що містить:

@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

Співробітник Контролер. клас, що містить:

@RestController
public class EmployeeController {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
        dataBinder.setDisallowedFields("id");
    }

    @RequestMapping(value = "/employee/save", method = RequestMethod.GET)
    public String save(){
        Employee newEmp = new Employee();
        newEmp.setAge(25);
        newEmp.setFirstName("Pikachu");
        newEmp.setId(100);
        return "Name: " + newEmp.getFirstName() + ", Age: " + newEmp.getAge() + ", Id = " + newEmp.getId();
    }
}

Якщо ваш основний клас знаходиться в кореневій папці, так само, як цей шлях: {projectname} / src / main / java / main, тоді переконайтесь, що ваші контролери нижче вашого основного класу. Наприклад {ім'я проекту} / src / main / java / main / контролери .


0

У свій файл Java (скажімо: Viper.java) з основним класом додайте: "@RestController" та @RequestMapping ("/")

@SpringBootApplication
@RestController
public class Viper {

  @RequestMapping("/")

   public String home(){
          return "This is what i was looking for";                      
     }

public static void main( String[] args){

   SpringApplication.run(Viper.class , args);
}

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.