Ответы пользователя по тегу Spring
  • Spring MVC, как необходимо обрабатывать формы с датой?

    EugeneP2
    @EugeneP2
    Java Dev
    Я так понял, вы сделали ввод даты в виде 3-полей... Обычно, делают одно поле и на это поле вешать js либу для вода дат, например JQuery Datepicker, а в контроллере делают все, что написал azerphoenix выше
    Ответ написан
    Комментировать
  • Как в Spring разослать асинхронные Http запросы, не блокируя поток?

    EugeneP2
    @EugeneP2
    Java Dev
    1) Кэшироапние. Все 5 внешних сервисов возвращают каждый раз уникальный ответ? Или сам сервис каждый раз возвращает уникальный ответ? - Если нет, то ответы нужно кэшировать + ограничивать время жизни кэша.

    2) Высокие тайминги внешних сервисов 5 * 350 = ~ 2000 - эти запросы нужно распараллелить. Создаем threadPool на много потоков и добавлять в него задачи Callable и по возвращенным Futures дожидаемся всех результатов и возвращаем их клиенту.

    3) увеличить в конфигах максимальное количество потоков самого контейнера (томката/джетти)

    4) Запустить сервис на разных машинах/инстансах и настроить лоад балансер, например Ribbon из спрингового стека технологий.

    ​Правильный совет вам дали sim3x и Довольный Жизнью , реализация через очередь и воркеры с последующим запросом результата клиентом по айди. На такой архитектуре работают много банковских сервисов и выдерживают большие нагрузки.

    ​Если вам уже так критично количество потоков или вы как то ограничены, то вам стоит обратить внимание на реактивное программирование Spring WebFlux
    Ответ написан
    Комментировать
  • Как правильно настроить отображение jsp в SpringBoot?

    EugeneP2
    @EugeneP2
    Java Dev
    Ответ написан
    Комментировать
  • В чем разница внедрения зависимостей по ссылке или по значению?

    EugeneP2
    @EugeneP2
    Java Dev
    value - для примитивов, стрингов, ${пропертей} и #{Spring Expression Language}.
    ref - если нужно заинжектить бин. В ref указывается id бина
    Ответ написан
    Комментировать
  • Для чего используется BindingResult в java?

    EugeneP2
    @EugeneP2
    Java Dev
    Из него мы можем узнать были ли ошибки валидации и какие при байденге http запроса на объект в контроллере

    Например, вот такой у нас контроллер
    @Controller
    public class SearchCommentController {
    
    	...................
    
    	@RequestMapping(method = RequestMethod.POST)
    	public String displayCommentAlert(@Validated FormParams params, BindingResult bindingResult, Model model) {
    		if (bindingResult.hasErrors() == false) {
    			List<CommentWithPeopleDetail> foundComments = commentDao.find(params);
    			model.addAttribute("foundComments", foundComments);
    		}
    		return "commentAlert";
    	}
    
    	...................
    }


    bindingResult инжектится спригом в метод контроллер

    вот валидатор
    public class SearchCommentParamValidator implements Validator {
    
    	@Override
    	public boolean supports(Class<?> clazz) {
    		return FormParams.class.isAssignableFrom(clazz);
    	}
    
    	@Override
    	public void validate(Object target, Errors errors) {
    
    		FormParams params = (FormParams) target;
    
    		if (StringUtils.isBlank(params.getRuleId()) && StringUtils.isBlank(params.getRef())) {
    			errors.reject(null, "Необходимо указать или 'ID правила', и/или 'Объект алерта'!");
    		} else if (params.getDateFrom() == null || params.getDateTo() == null) {
    			errors.reject(null, "Необходимо указать период поиска!");
    		}
    	}
    }
    Ответ написан
    Комментировать
  • Почему не подхватывается Converter?

    EugeneP2
    @EugeneP2
    Java Dev
    Сам бин conversionService нужно указать в <mvc:annotation-driven/>

    Conversion and Formatting

    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set merge="true">
                <bean class="my.app.OptionConverter"/>
            </set>
        </property>
    </bean>
    
      <mvc:annotation-driven conversion-service="conversionService"/>
    Ответ написан
    5 комментариев
  • Есть ли в Java/Spring транзакции на изменение объектов?

    EugeneP2
    @EugeneP2
    Java Dev
    1-й вариант: Не использовать изменяемый объект, а каждый раз, когда вы хотите поменять что-то, создавать новый объект, при этом, сам объект должен быть immutable. Доступ к объекту осуществлять через фабрику. Такое решение имхо будит наиболее правильным.

    Пример:

    immutable класс

    public final class User {
    
    	private final String login;
    	private final Date dateCreate;
    	private final String description;
    	private final Set<String> roles;
    
    	public User(String login, Date dateCreate, String description, Set<String> roles) {
    		this.login = login;
    		this.dateCreate = (Date) dateCreate.clone();
    		this.description = description;
    		this.roles = Collections.unmodifiableSet(roles);
    	}
    
    	public String getLogin() {
    		return login;
    	}
    
    	public Date getDateCreate() {
    		return (Date) dateCreate.clone();
    	}
    
    	public String getDescription() {
    		return description;
    	}
    
    	public Set<String> getRoles() {
    		return roles;
    	}
    }


    Фабрика

    public class UserFactory<T> {
    
    	private final AtomicReference<T> atomicReference;
    
    	public UserFactory(T object) {
    		this.atomicReference = new AtomicReference<>(object);
    	}
    
    	public T getObject() {
    		return atomicReference.get();
    	}
    
    	public void setObject(T object) {
    		atomicReference.set(object);
    	}
    }


    public static void main(String[] args) {
    
    		User user = new User("user1", new Date(), "test user", new HashSet<>(Arrays.asList("READ", "ADD")));
    
    		UserFactory<User> userFactory = new UserFactory<>(user);
    
    		exampleUsingUser(userFactory);
    
    	}
    
    	public static void exampleUsingUser(UserFactory<User> userFactory) {
    
    		User user = userFactory.getObject();
    
    		System.out.println(user.getLogin());
    		System.out.println(user.getDescription());
    		System.out.println(user.getRoles());
    	}


    2-й вариант: эдакий велосипед:) Контролировать доступ через прокси с использованием ReentrantReadWriteLock

    Пример:

    Для начала нам нужно выделить интерфейс класса, состояние объекта которого будет меняться

    public interface Settings {
    
    	String getColor();
    	void setColor(String color);
    
    	String getDescription();
    	void setDescription(String description);
    
    	int getSize();
    	void setSize(int size);
    }


    Реализуем интерфейс

    public class SettingsImpl implements Settings {
    
    	private volatile String color;
    	private volatile String description;
    	private volatile int size;
    
    
    	public static Settings newSettings() {
    		return ProxySettingsKeeper.createProxy(new SettingsImpl());
    	}
    	
    	private SettingsImpl() {
    	}
    
    	@Override
    	public String getColor() {
    		return color;
    	}
    
    	@Override
    	public void setColor(String color) {
    		this.color = color;
    	}
    
    	@Override
    	public String getDescription() {
    		return description;
    	}
    
    	@Override
    	public void setDescription(String description) {
    		this.description = description;
    	}
    
    	@Override
    	public int getSize() {
    		return size;
    	}
    
    	@Override
    	public void setSize(int size) {
    		this.size = size;
    	}
    }


    Прокси

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    public class ProxySettingsKeeper implements InvocationHandler {
    
    	private final Settings settings;
    
    	private final ReentrantReadWriteLock.ReadLock readLock;
    	private final ReentrantReadWriteLock.WriteLock writeLock;
    
    	public ProxySettingsKeeper(Settings settings) {
    
    		ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    		this.readLock = readWriteLock.readLock();
    		this.writeLock = readWriteLock.writeLock();
    
    		this.settings = settings;
    	}
    
    	public static Settings createProxy(Settings settings) {
    		return (Settings) Proxy.newProxyInstance(settings.getClass().getClassLoader()
    				, new Class[]{Settings.class}
    				, new ProxySettingsKeeper(settings));
    	}
    
    
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    		String name = method.getName();
    
    		if (name.startsWith("get")) {
    
    			readLock.lock();
    			try {
    				return method.invoke(settings, args);
    			} finally {
    				readLock.unlock();
    			}
    
    		} else if (name.startsWith("set")) {
    
    			writeLock.lock();
    			try {
    				return method.invoke(settings, args);
    			} finally {
    				writeLock.unlock();
    			}
    		}
    
    		return method.invoke(settings, args);
    	}
    }


    public static void main(String[] args) {
    
    		Settings settings = SettingsImpl.newSettings();
    
    		settings.setDescription("test");
    
    		System.out.println(settings.getDescription());
    	}
    Ответ написан
  • Есть ли в Spring своя библиотека для делания HTTP запросов?

    EugeneP2
    @EugeneP2
    Java Dev
    RestTemplate

    находится в пакете spring-web
    Ответ написан
    Комментировать
  • JSP/JSTL vs Thymeleaf что выбрать?

    EugeneP2
    @EugeneP2
    Java Dev
    Хорошая презентация мир без Jsp. thymeleaf 2.0
    Ответ написан
    Комментировать
  • Какие JAVA библиотеки полезны для работы с API?

    EugeneP2
    @EugeneP2
    Java Dev
    Или спринговый RestTemplate

    Или jersey client
    Ответ написан
    Комментировать
  • Откуда можно достать java проекты с ипользованием Spring Data,Hibernate,HTML,CSS,JSP,Maven?

    EugeneP2
    @EugeneP2
    Java Dev
    Например через поиск на GitHub. Конечно придется немного порыться, но тем не менее...
    Ответ написан
    2 комментария
  • Где лучше хранить данные с хедера / футера?

    EugeneP2
    @EugeneP2
    Java Dev
    Например хранить в кэше Spring Cache
    Ответ написан
    Комментировать
  • Хороший туториал или книгу по Spring?

    EugeneP2
    @EugeneP2
    Java Dev
    Все очень просто. Заходите на рутрекер, вбиваете в поиск SPRING FRAMEWORK, результаты сортируете по свежести и выбираете: видео лекции, видео уроки и.п. видео. Качаем парочку, смотрим, пытаемся сами делать примеры.
    Ответ написан
    Комментировать
  • Как построить дерево папок?

    EugeneP2
    @EugeneP2
    Java Dev
    Вам нужно написать контроллер, который принимает в качестве параметра путь в файловой системе, например:
    D:/
    D:/Music/
    D:/Music/Classic/
    и т.д.

    В контроллере вы по этому пути получаете список подкаталогов и файлов и возвращаете в виде json. Как в примерах zTree:

    [
    	{name: "pNode 01", children: [
    		{name: "child 01"},
    		{name: "child 02"}
    	]}
    ]


    По умолчанию на странице отображается только корневой узел D:/
    Кликнув по узлу, ajax-ом отправляете запрос к контроллеру в котором передаете D:/, контроллер возвращает список подкаталогов, вы передаете это в zTree и.д.
    Ответ написан
    Комментировать
  • Можно ли пропустить обучение Java EE если в будущем хочешь работать со Spring Framework?

    EugeneP2
    @EugeneP2
    Java Dev
    Servlet API, JMS и JPA понадобится
    Ответ написан
    Комментировать
  • Как работает контроллер при большом количестве запросов?

    EugeneP2
    @EugeneP2
    Java Dev
    каждый запрос будет работать в отдельном потоке. В томкате например по умолчанию максимум 200 потоков, все остальные запросы будут вылетать по таймауту.

    вот этот метод должен быть готов в многопоточности
    service.getCalcSumm();
    Ответ написан
    1 комментарий
  • Насколько нужно знать java для Spring Framework? И зачем нужна java EE?

    EugeneP2
    @EugeneP2
    Java Dev
    Нужно знать Java SE + Servlet API (это уже из Java EE).

    Spring дает все те же возможности (IoC и DI, транзакции и.д.) что и Java ЕЕ, только проще в использовании и не нужен сервер приложение (jboss, glassfish), достаточно tomcat или jetty.

    Java EE это набор спецификаций и интерфейсов, который реализуют производители серверов приложений (jboss, glassfish). Spring - как простая альтернатива.
    Ответ написан
    2 комментария
  • Как правильно настроить дистпетчер, для JSON ответов?

    EugeneP2
    @EugeneP2
    Java Dev
    как насчет @ResponseBody ?

    @RequestMapping("/api")
        public @ResponseBody Api api(@RequestParam(value = "name", required = false, defaultValue = "!!!") String name){
            return new Api(counter.incrementAndGet(), String.format(template, name));
        }
    Ответ написан
    3 комментария