powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Library for comparison two complex java-objects?
11 сообщений из 11, страница 1 из 1
Library for comparison two complex java-objects?
    #38782168
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Проблема в следующем, впрочем все должно быть понятно из названия. нужно сравнивать две достаточно сложные модели.
Чтоб не писать для каждого класса "компаратор" - разискивается соответствующая библиотека.

Была найдена сл библиотека. https://github.com/SQiShER/java-object-diff
При обкатке стала выдавать следующее
Код: java
1.
java.lang.IllegalStateException: Couldn't find a differ for type: [Lcom.model.Note;

- что и почему не нашел, предположил что не хватает возможно конструкторов по умолчанию, после добавления ничего не изменилось.


Кто что посоветует, подскажет? или все-таки выгодней и быстрее будет писать собственные "компараторы"?
Но это может усложнить поддержку в будущем, к примеру с добавлением или удалением одного или нескольких полей из модели и так д...

Спасибо.
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782187
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлю, что используется jaxb - может есть смысл сравнивать 2 xml-обьекта?
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782193
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_webdev_,

Вариант исправить ошибку в своём коде не рассматривается? Может она массивы не понимает?
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782246
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_webdev_Чтоб не писать для каждого класса "компаратор" - разискивается соответствующая библиотека.
google guava Class ComparisonChain
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782484
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше руками.
Причины:
- Если автокомпаратор не сработает, то причину будешь искать долго и упорно
- исправлять ошибки намного проще в коде, написанном руками
- в IDE есть автогенерация equals/hashCode
- если подключить Lombok (очень рекомендую), то вообще можно обойтись одной аннотацией

Если нужен именно Comparable, то пишите руками, ну, с Guava.

В целом - не нужно бояться, что при добавлении поля забудешь вписать его в компаратор. Вариант "я добавил/переименовал/удалил поле и все сломалось" намного страшнее, т.к. компилятор тебя не предупредит и искать потом ошибку без юнит-теста и тщательной отладки будет непросто.
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782649
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Наверное не рассматривается, так как такую же ошибку выдает и на обычный String и на другие объекты.
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782653
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rema174_webdev_Чтоб не писать для каждого класса "компаратор" - разискивается соответствующая библиотека.
google guava Class ComparisonChain - так она ж работает только с примитивными типами. Мне хочется чтоб разбирался мой объект рекурсивно. К римеру масивы каких-то объектов и так д...
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782657
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
scfЛучше руками.
Причины:
- Если автокомпаратор не сработает, то причину будешь искать долго и упорно
- исправлять ошибки намного проще в коде, написанном руками
- в IDE есть автогенерация equals/hashCode
- если подключить Lombok (очень рекомендую), то вообще можно обойтись одной аннотацией

Если нужен именно Comparable, то пишите руками, ну, с Guava.

В целом - не нужно бояться, что при добавлении поля забудешь вписать его в компаратор. Вариант "я добавил/переименовал/удалил поле и все сломалось" намного страшнее, т.к. компилятор тебя не предупредит и искать потом ошибку без юнит-теста и тщательной отладки будет непросто. - дык знаю, о Ломбоке, сам его использую, но в этом проекте сидят старые динозавры. ))) Не хотят новыми библиотеками код загружать.)))
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782748
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_webdev_,

может JaVers
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38782755
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rema174_webdev_,

может JaVers - спасибо, очень интересно - сейчас попробую. Почему-то не встречалась мне эта библиотека.
...
Рейтинг: 0 / 0
Library for comparison two complex java-objects?
    #38783000
_webdev_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_webdev_rema174_webdev_,

может JaVers - спасибо, очень интересно - сейчас попробую. Почему-то не встречалась мне эта библиотека.

Новая версия вообще javers-объект создавать не хочет.
постарее создает, но в итоге получаю...

И хз, что и где неправильно..


Код: java
1.
Payload: {"cause":null,"stackTrace":[{"methodName":"getFields","fileName":"FieldBasedPropertyScanner.java","lineNumber":37,"className":"org.javers.core.metamodel.property.FieldBasedPropertyScanner","nativeMethod":false},{"methodName":"getFields","fileName":"FieldBasedPropertyScanner.java","lineNumber":41,"className":"org.javers.core.metamodel.property.FieldBasedPropertyScanner","nativeMethod":false},{"methodName":"scan","fileName":"FieldBasedPropertyScanner.java","lineNumber":23,"className":"org.javers.core.metamodel.property.FieldBasedPropertyScanner","nativeMethod":false},{"methodName":"infer","fileName":"ManagedClassFactory.java","lineNumber":32,"className":"org.javers.core.metamodel.property.ManagedClassFactory","nativeMethod":false},{"methodName":"infer","fileName":"TypeFactory.java","lineNumber":45,"className":"org.javers.core.metamodel.type.TypeFactory","nativeMethod":false},{"methodName":"createMapping","fileName":"TypeMapper.java","lineNumber":179,"className":"org.javers.core.metamodel.type.TypeMapper","nativeMethod":false},{"methodName":"getJaversType","fileName":"TypeMapper.java","lineNumber":80,"className":"org.javers.core.metamodel.type.TypeMapper","nativeMethod":false},{"methodName":"getPropertyType","fileName":"TypeMapper.java","lineNumber":94,"className":"org.javers.core.metamodel.type.TypeMapper","nativeMethod":false},{"methodName":"isEntityReferenceOrValueObject","fileName":"TypeMapper.java","lineNumber":98,"className":"org.javers.core.metamodel.type.TypeMapper","nativeMethod":false},{"methodName":"apply","fileName":"ObjectGraphBuilder.java","lineNumber":121,"className":"org.javers.core.graph.ObjectGraphBuilder$1","nativeMethod":false},{"methodName":"apply","fileName":"ObjectGraphBuilder.java","lineNumber":119,"className":"org.javers.core.graph.ObjectGraphBuilder$1","nativeMethod":false},{"methodName":"getProperties","fileName":"ManagedClass.java","lineNumber":66,"className":"org.javers.core.metamodel.property.ManagedClass","nativeMethod":false},{"methodName":"getSingleReferences","fileName":"ObjectGraphBuilder.java","lineNumber":119,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildSingleEdges","fileName":"ObjectGraphBuilder.java","lineNumber":90,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildEdges","fileName":"ObjectGraphBuilder.java","lineNumber":76,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"continueIfStub","fileName":"ObjectGraphBuilder.java","lineNumber":85,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildSingleEdges","fileName":"ObjectGraphBuilder.java","lineNumber":97,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildEdges","fileName":"ObjectGraphBuilder.java","lineNumber":76,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"continueIfStub","fileName":"ObjectGraphBuilder.java","lineNumber":85,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildSingleEdges","fileName":"ObjectGraphBuilder.java","lineNumber":97,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildEdges","fileName":"ObjectGraphBuilder.java","lineNumber":76,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"continueIfStub","fileName":"ObjectGraphBuilder.java","lineNumber":85,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildSingleEdges","fileName":"ObjectGraphBuilder.java","lineNumber":97,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildEdges","fileName":"ObjectGraphBuilder.java","lineNumber":76,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"continueIfStub","fileName":"ObjectGraphBuilder.java","lineNumber":85,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildSingleEdges","fileName":"ObjectGraphBuilder.java","lineNumber":97,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildEdges","fileName":"ObjectGraphBuilder.java","lineNumber":76,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"continueIfStub","fileName":"ObjectGraphBuilder.java","lineNumber":85,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildNode","fileName":"ObjectGraphBuilder.java","lineNumber":63,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"buildGraph","fileName":"ObjectGraphBuilder.java","lineNumber":46,"className":"org.javers.core.graph.ObjectGraphBuilder","nativeMethod":false},{"methodName":"createLiveGraph","fileName":"LiveGraphFactory.java","lineNumber":21,"className":"org.javers.core.graph.LiveGraphFactory","nativeMethod":false},{"methodName":"createLiveGraph","fileName":"GraphFactory.java","lineNumber":31,"className":"org.javers.core.GraphFactory","nativeMethod":false},{"methodName":"buildGraph","fileName":"DiffFactory.java","lineNumber":67,"className":"org.javers.core.diff.DiffFactory","nativeMethod":false},{"methodName":"compare","fileName":"DiffFactory.java","lineNumber":49,"className":"org.javers.core.diff.DiffFactory","nativeMethod":false},{"methodName":"compare","fileName":"Javers.java","lineNumber":88,"className":"org.javers.core.Javers","nativeMethod":false},{"methodName":"updateContact","fileName":"WcmService.java","lineNumber":68,"className":"com.klopotek.soa.wcm.service.WcmService","nativeMethod":false},{"methodName":"invoke0","fileName":"NativeMethodAccessorImpl.java","lineNumber":-2,"className":"sun.reflect.NativeMethodAccessorImpl","nativeMethod":true},{"methodName":"invoke","fileName":"NativeMethodAccessorImpl.java","lineNumber":57,"className":"sun.reflect.NativeMethodAccessorImpl","nativeMethod":false},{"methodName":"invoke","fileName":"DelegatingMethodAccessorImpl.java","lineNumber":43,"className":"sun.reflect.DelegatingMethodAccessorImpl","nativeMethod":false},{"methodName":"invoke","fileName":"Method.java","lineNumber":606,"className":"java.lang.reflect.Method","nativeMethod":false},{"methodName":"performInvocation","fileName":"AbstractInvoker.java","lineNumber":181,"className":"org.apache.cxf.service.invoker.AbstractInvoker","nativeMethod":false},{"methodName":"invoke","fileName":"AbstractInvoker.java","lineNumber":97,"className":"org.apache.cxf.service.invoker.AbstractInvoker","nativeMethod":false},{"methodName":"invoke","fileName":"JAXRSInvoker.java","lineNumber":200,"className":"org.apache.cxf.jaxrs.JAXRSInvoker","nativeMethod":false},{"methodName":"invoke","fileName":"JAXRSInvoker.java","lineNumber":99,"className":"org.apache.cxf.jaxrs.JAXRSInvoker","nativeMethod":false},{"methodName":"run","fileName":"ServiceInvokerInterceptor.java","lineNumber":59,"className":"org.apache.cxf.interceptor.ServiceInvokerInterceptor$1","nativeMethod":false},{"methodName":"handleMessage","fileName":"ServiceInvokerInterceptor.java","lineNumber":96,"className":"org.apache.cxf.interceptor.ServiceInvokerInterceptor","nativeMethod":false},{"methodName":"doIntercept","fileName":"PhaseInterceptorChain.java","lineNumber":307,"className":"org.apache.cxf.phase.PhaseInterceptorChain","nativeMethod":false},{"methodName":"onMessage","fileName":"ChainInitiationObserver.java","lineNumber":121,"className":"org.apache.cxf.transport.ChainInitiationObserver","nativeMethod":false},{"methodName":"invoke","fileName":"AbstractHTTPDestination.java","lineNumber":243,"className":"org.apache.cxf.transport.http.AbstractHTTPDestination","nativeMethod":false},{"methodName":"invokeDestination","fileName":"ServletController.java","lineNumber":223,"className":"org.apache.cxf.transport.servlet.ServletController","nativeMethod":false},{"methodName":"invoke","fileName":"ServletController.java","lineNumber":197,"className":"org.apache.cxf.transport.servlet.ServletController","nativeMethod":false},{"methodName":"invoke","fileName":"ServletController.java","lineNumber":149,"className":"org.apache.cxf.transport.servlet.ServletController","nativeMethod":false},{"methodName":"invoke","fileName":"CXFNonSpringServlet.java","lineNumber":171,"className":"org.apache.cxf.transport.servlet.CXFNonSpringServlet","nativeMethod":false},{"methodName":"handleRequest","fileName":"AbstractHTTPServlet.java","lineNumber":286,"className":"org.apache.cxf.transport.servlet.AbstractHTTPServlet","nativeMethod":false},{"methodName":"doGet","fileName":"AbstractHTTPServlet.java","lineNumber":211,"className":"org.apache.cxf.transport.servlet.AbstractHTTPServlet","nativeMethod":false},{"methodName":"service","fileName":"HttpServlet.java","lineNumber":687,"className":"javax.servlet.http.HttpServlet","nativeMethod":false},{"methodName":"service","fileName":"AbstractHTTPServlet.java","lineNumber":262,"className":"org.apache.cxf.transport.servlet.AbstractHTTPServlet","nativeMethod":false},{"methodName":"handleRequest","fileName":"ServletHandler.java","lineNumber":85,"className":"io.undertow.servlet.handlers.ServletHandler","nativeMethod":false},{"methodName":"doFilter","fileName":"FilterHandler.java","lineNumber":130,"className":"io.undertow.servlet.handlers.FilterHandler$FilterChainImpl","nativeMethod":false},{"methodName":"doFilter","fileName":"CORSFilter.java","lineNumber":174,"className":"com.thetransactioncompany.cors.CORSFilter","nativeMethod":false},{"methodName":"doFilter","fileName":"CORSFilter.java","lineNumber":237,"className":"com.thetransactioncompany.cors.CORSFilter","nativeMethod":false},{"methodName":"doFilter","fileName":"ManagedFilter.java","lineNumber":60,"className":"io.undertow.servlet.core.ManagedFilter","nativeMethod":false},{"methodName":"doFilter","fileName":"FilterHandler.java","lineNumber":132,"className":"io.undertow.servlet.handlers.FilterHandler$FilterChainImpl","nativeMethod":false},{"methodName":"handleRequest","fileName":"FilterHandler.java","lineNumber":85,"className":"io.undertow.servlet.handlers.FilterHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"ServletSecurityRoleHandler.java","lineNumber":61,"className":"io.undertow.servlet.handlers.security.ServletSecurityRoleHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"ServletDispatchingHandler.java","lineNumber":36,"className":"io.undertow.servlet.handlers.ServletDispatchingHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"SecurityContextAssociationHandler.java","lineNumber":78,"className":"org.wildfly.extension.undertow.security.SecurityContextAssociationHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"PredicateHandler.java","lineNumber":25,"className":"io.undertow.server.handlers.PredicateHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"SSLInformationAssociationHandler.java","lineNumber":113,"className":"io.undertow.servlet.handlers.security.SSLInformationAssociationHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"ServletAuthenticationCallHandler.java","lineNumber":56,"className":"io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"PredicateHandler.java","lineNumber":25,"className":"io.undertow.server.handlers.PredicateHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"AbstractConfidentialityHandler.java","lineNumber":45,"className":"io.undertow.security.handlers.AbstractConfidentialityHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"ServletConfidentialityConstraintHandler.java","lineNumber":61,"className":"io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"AuthenticationMechanismsHandler.java","lineNumber":58,"className":"io.undertow.security.handlers.AuthenticationMechanismsHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"CachedAuthenticatedSessionHandler.java","lineNumber":70,"className":"io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"SecurityInitialHandler.java","lineNumber":76,"className":"io.undertow.security.handlers.SecurityInitialHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"PredicateHandler.java","lineNumber":25,"className":"io.undertow.server.handlers.PredicateHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"JACCContextIdHandler.java","lineNumber":61,"className":"org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"PredicateHandler.java","lineNumber":25,"className":"io.undertow.server.handlers.PredicateHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"PredicateHandler.java","lineNumber":25,"className":"io.undertow.server.handlers.PredicateHandler","nativeMethod":false},{"methodName":"handleFirstRequest","fileName":"ServletInitialHandler.java","lineNumber":240,"className":"io.undertow.servlet.handlers.ServletInitialHandler","nativeMethod":false},{"methodName":"dispatchRequest","fileName":"ServletInitialHandler.java","lineNumber":227,"className":"io.undertow.servlet.handlers.ServletInitialHandler","nativeMethod":false},{"methodName":"access$000","fileName":"ServletInitialHandler.java","lineNumber":73,"className":"io.undertow.servlet.handlers.ServletInitialHandler","nativeMethod":false},{"methodName":"handleRequest","fileName":"ServletInitialHandler.java","lineNumber":146,"className":"io.undertow.servlet.handlers.ServletInitialHandler$1","nativeMethod":false},{"methodName":"executeRootHandler","fileName":"Connectors.java","lineNumber":177,"className":"io.undertow.server.Connectors","nativeMethod":false},{"methodName":"run","fileName":"HttpServerExchange.java","lineNumber":727,"className":"io.undertow.server.HttpServerExchange$1","nativeMethod":false},{"methodName":"runWorker","fileName":"ThreadPoolExecutor.java","lineNumber":1145,"className":"java.util.concurrent.ThreadPoolExecutor","nativeMethod":false},{"methodName":"run","fileName":"ThreadPoolExecutor.java","lineNumber":615,"className":"java.util.concurrent.ThreadPoolExecutor$Worker","nativeMethod":false},{"methodName":"run","fileName":"Thread.java","lineNumber":745,"className":"java.lang.Thread","nativeMethod":false}],"message":null,"localizedMessage":null,"suppressed":[]}
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Library for comparison two complex java-objects?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]