Posts

Showing posts with the label Java

Spring jpa criteria example

 import jakarta.persistence.EntityManager; import jakarta.persistence.TypedQuery; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Month; import java.util.List; import java.util.Objects; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; @Component public class TransactionCriteria { private static final String TRANSACTION_POINT = "transactionPoint"; private static final String EARNED_POINTS = "earnedPoints"; private static final String CREATED_AT = "createdAt"; private static final String OPERATION_TYPE = "operationType"; private static final String CUSTOMER_ID = ...

Exception handling mechanism prompt for spring boot project

 ## Exception Mechanism — Prompt (Spring Boot Microservice) ### Goal Build a standardized, i18n-enabled exception mechanism in a Spring Boot microservice that returns error responses aligned with HTTP status codes. --- ### Package structure ``` exception/ ├── base/ │ ├── BaseErrorService.java (interface) │ ├── BaseErrorEnum.java (common/base error codes) │ ├── BaseException.java (abstract exception) │ ├── BaseErrorResponseDto.java (API response DTO) │ └── {Specific}Exception.java (optional — domain-specific, extends BaseException) ├── {ServiceName}ErrorEnum.java (project-specific error enum) ├── {ServiceName}Exception.java (general domain exception) ├── {Domain}Exception.java (domain exceptions — as needed) ├── ClientException.java (Feign/external error wrapper — SEPARATE from BaseException) └── GlobalExceptionHandler.java (@RestControllerAdvice) ``` --- ### 1. `BaseErrorService` (interface) The contract that al...

Resolver for token headers

 Header values in class:  @Data  @Builder  @NoArgsConstructor  @AllArgsConstructor  public class UserClaims {        private Long userId;      private String customerId;      private String taxId;      private Boolean isDirector;      private String personalCode;  } Resolver config  @Configuration  @RequiredArgsConstructor  public class MethodArgumentResolverConfig implements WebMvcConfigurer {        @Override      public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {          argumentResolvers.add(userClaimsResolver());      }        @Bean      public UserClaimsResolver userClaimsResolver() {          return new UserClaimsResolver();      }    } Resolver clas...

AuditableDate for entities in jpa

 import jakarta.persistence.Column;  import jakarta.persistence.EntityListeners;  import jakarta.persistence.MappedSuperclass;  import java.io.Serial;  import java.io.Serializable;  import java.time.LocalDateTime;  import lombok.Getter;  import lombok.Setter;  import org.springframework.data.annotation.CreatedDate;  import org.springframework.data.annotation.LastModifiedDate;  import org.springframework.data.jpa.domain.support.AuditingEntityListener;    @Getter  @Setter  @MappedSuperclass  @EntityListeners(AuditingEntityListener.class)  public class AuditableDate implements Serializable {        @Serial      private static final long serialVersionUID = 1L;        @CreatedDate      @Column(updatable = false)      private LocalDateTime createdAt;        @LastModifiedDate      private Loc...

Spring boot kafka job example

application-kafka.yml file:  spring:    kafka:      listener:        ack-mode: manual      consumer:        key-deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer        value-deserializer: org.springframework.kafka.support.serializer.ErrorHandlingDeserializer        properties:          spring.json.use.type.headers: false          spring.json.trusted.packages: com.example.*          spring.deserializer.key.delegate.class: org.apache.kafka.common.serialization.StringDeserializer          spring.deserializer.value.delegate.class: org.springframework.kafka.support.serializer.JsonDeserializer        auto-offset-reset: latest        enable-auto-commit: false        operation-re...

write huge text into clob column in oracle

 varchar2 max character size is 32767 , that's why writing huge texts into column is problem. CLOB type is used for this, it can store 2,147,483,647 characters. But it is a bit problematic to write more than 32767 characters into CLOB typed column. For doing that either we should read from file or divide into small chunks. In example we will do this by chunks Firstly: package org.example; import java.io.*; import java.util.ArrayList; import java.util.List; public class FileChunker { private static final int CHUNK_SIZE = 21000; // Size of each chunk public static void main(String[] args) { String filePath = "/Users/bbb/Documents/aaa/new_license/license_en.html"; // Path to your file String outputDir = "/Users/bbb/Documents/aaa/new_license/chunks_en"; // Directory to save chunks try { List<String> chunks = splitFileIntoChunks (filePath); createFilesFromChunks (chunks, outputDir); System. out...

entity id sequence la generate olan zaman hibernate in bazaya select gondermesi

hibernate, entity id uchun sequence istifade ederken @GeneratedValue( generator = "USERS_ID_SEQ_GEN", strategy = GenerationType.SEQUENCE) @SequenceGenerator( name = "USERS_ID_SEQ_GEN", sequenceName = "USERS_ID_SEQ", allocationSize = 1)  her save etmezden qabag bazaya sequencein novbeti valuesunu oyrenmek uchun sorgu atir bu selectin sayini azaltmaq uchun allocationSize -i boyuk eded vermek olar. Onda her eded tamamlandiqda sorgu gonderilib novbeti tsikl oyrenilecek. Bunun menfisi odur ki, app restart olanda yeni save olunacaq entitylerin idsi bazadaki sonuncu id + allocation size a beraber olur. Yeni sonuncu id = 5 olanda restart gedibse , eger allocation = 50 dirse , onda yeniler 55den bashlayacaq.  selecti umumyetle legv etmek uchun, @GeneratedValue(strategy = GenerationType.IDENTITY) istifade ede bilerik. Bu zaman hibernate save olunacaq entitynin idsini bilmir ve id bazada yaradilir. Bunun menfisi odur ki, bulk i...

Inject private field from unit test

public class DeeplinkService {  @Value("${deeplink}")  private String deeplink; } class DeeplinkServiceTest { @InjectMocks private DeeplinkService deeplinkService; @BeforeEach  public void setup() { { ReflectionTestUtils.setField( deeplinkService, "deeplink", TestConstants.TEST_DEEPLINK ); } } It is possible to inject private field from unit test with Reflection

libfontmanager.so: libfreetype.so.6 not found error in docker image when trying to generate excel with Apache Poi

  FROM openjdk: 11.0.3 - jdk-slim-stretch imageinde  libfontmanager.so: libfreetype.so.6 bu lib olmur ona gorede. ,apache poi ile excel generate etmeye chalishanda xeta aliriq Xetanin ozu:  "java.lang.UnsatisfiedLinkError: /usr/local/openjdk-11/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory Hell etmek uchun Dockerfile a bu stepi elave etmek lazimdir RUN set -eux; \ apt-get update; \ apt-get install -y --no-install-recommends fontconfig libfreetype6; \ rm -rf /var/lib/apt/lists/* Menbe: https://hub.docker.com/r/hydrz/openjdk/dockerfile

Testing mock with Clock object for LocalDateTime now

 LocalDateTime.now() will create problem when unit testing, for this purpose using help of Clock object is recommended way. Let's see example: @Service @RequiredArgsConstructor @Slf4j public class OrdersServiceImpl implements OrdersService { private final OrdersRepository ordersRepository ; private final OrdersDeliveryEventsRepository ordersDeliveryEventsRepository ; private final MailService mailService ; private final Clock clock = Clock. systemDefaultZone () ; private final FileGenerator fileGenerator ; @Override @Scheduled (cron = "${cron.expression}" ) @SchedulerLock (name = "TaskScheduler_processOrders" , lockAtMostFor = "15M" , lockAtLeastFor = "2M" ) public void processOrders () throws IOException { log .info( "processOrders started" ) ; List<OrdersEntity> unsentOrders = ordersRepository .getUnsentOrders(LocalDateTime. now ( clock ).minusDa...

Jackson Date Serialize and Deserialize with UTC+0 format and UTC+4

public class JacksonConfig { private static final String DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss" ; public static class CustomLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter. ofPattern ( DATE_TIME_FORMAT ) ; @Override public Class<LocalDateTime> handledType () { return LocalDateTime. class; } @Override public LocalDateTime deserialize (JsonParser parser , DeserializationContext ctxt) throws IOException { LocalDateTime dateTime = LocalDateTime. parse (parser.getText() , DATE_TIME_FORMATTER ) ; return dateTime.atZone(ZoneId. of ( "UTC" )) .withZoneSameInstant(ZoneId. systemDefault ()).toLocalDateTime() ; } } public static class CustomLocalDateTimeSerializer extends JsonSerializer<LocalDate...

AES encrypt-decrypt in Java

 public static String decrypt(byte[] data, byte[] key) throws NoSuchPaddingException, NoSuchAlgorithmException,             BadPaddingException, IllegalBlockSizeException, InvalidKeyException {         Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");         aes.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key,     "AES"));         return new String(Base64.getDecoder().decode(Base64.getEncoder().encodeToString((aes.doFinal(data))))); } public static String encrypt(byte[] data, byte[] key) throws NoSuchPaddingException, NoSuchAlgorithmException,             BadPaddingException, IllegalBlockSizeException, InvalidKeyException {         Cipher aes = Cipher.getInstance("AES/ECB/PKCS5Padding");         aes.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key,     "AES"));         return Ba...

Product.class dan List.class i almaq

 public static <T> Class<List<T>> getListClass(Class<T> cls) {         return (Class<List<T>>) (Class<?>) List.class; } bu metoda Product.class gonderib List<Product>.class aliriq istifade case i  final List<Product> entities =                 findProduct.executeFunction(getListClass(Product.class), sqlParameterSource); oracle bazadan data getirik ve bu list sheklidedir , ona gore de executeFunctionun ilk paramina list tipinde class gondermeliyik QEYD : adi halda List<Product>.class yazmaq olmur error verir

dto ichinde list dto map etmek

Entity classlar verilir:  public class Partner implements Serializable {          @OneToMany(mappedBy = "partner")     private List<Store> stores = new ArrayList<>(); } public class Store implements Serializable {          @ManyToOne     @JoinColumn(name = "partner_id", referencedColumnName = "id", nullable = false)     private Partner partner; } public class PartnerResponseDto {          private List<StoreResponseDto> stores;      } public interface PartnerMapper { List<PartnerResponseDto> toPartnerResponseDtoListI(List<Partner> partners); PartnerResponseDto toPartnerResponseDto(Partner partner); StoreResponseDto storeToStoreResponseDto(Store store); } MÉ™ntiq buduki qaytardığın dtonun içindÉ™ olan dtolar ayrıca bildirilmÉ™lidi mapperdÉ™ 1 ci setrde servis list qaytarir deye list map olur , 2 ci setr ise dtonun ozudu , 3 cu setrde ise ma...

Java Date and Time examples

look at: https://stackabuse.com/how-to-get-current-date-and-time-in-java/  valuable source about java date classes : https://stackoverflow.com/questions/32437550/whats-the-difference-between-instant-and-localdatetime System.out.println(LocalDateTime.now()); 2021-03-19T13:27:06.043 System.out.println(Instant.now()); 2021-03-19T09:27:06.044Z System.out.println(LocalDateTime.now().atZone(ZoneId.systemDefault())); 2021-03-19T13:27:06.057+04:00[Asia/Baku] System.out.println(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()); 2021-03-19T09:27:06.058Z System.out.println(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant())); Fri Mar 19 13:27:06 AZT 2021 System.out.println(new Date()); Fri Mar 19 13:27:06 AZT 2021 System.out.println(LocalDate.now()); 2021-03-19 System.out.println(LocalTime.now()); 13:27:06.066 System.out.println(ZonedDateTime.now()); 2021-03-19T13:27:06.066+04:00[Asia/Baku] System.out.println(ZoneId.systemDefault()); Asia/Baku System.o...

oracle pl/sql ve hibernate arasinda array tiplerle ishlemek

oracle pl/sql prosedurlarla ishleyerken bazada yaradilan custom array typelarla(base integer ve ya stringden ibaretdir) ishleyerken java terefde problem olur , HikaryDataSoruce da arraylar createArrayOf ile yaranir  , oracle ise ancaq createArray ile yaradilan array typelari qebul edir . bu problemi hell etmek uchun:     public OracleConnection getOracleConnection() {         Connection conn = oracleDb().getConnection();         return conn.unwrap(OracleConnection.class);     } Array prodCodes = getOracleConnection.createArray("BACK.T_STR_COLL", request.getProdCodes()); array i bazaya oturmemishden evvel OracleConnection u almaq lazimdir bunu da yuxarida olan kod ile almaq olur , daha sonra ui dan oturulen arrayi javada OracleConnectionun createArray metodu ile yaradib o formada bazaya oturmek lazimdir burada SimpleJdbcCall vasitesile oracle pl/sql proseduru chagirilir , nece chagirilmagi docda var: https://docs.spring.io/...

.csv faylda melumati verib liqubase ile bazaya insert etmek

 bu ad_groups.csv faylda olan data   :    id;name;description 1;HEAD_OF_CASHIER;Head of Cashier 2;Cashier;Cashier 3;Teller;Teller 4;KAD;Underwriter 5;HEAD_OF_TELLER;Head of Teller bu ise liqubase faylda de tetbiqi : <loadData file="config/liquibase/ad_groups.csv"                   separator=";"                   tableName="active_directory_group"/>

timezone ile bagli Jackson deserializableda problem

  demeli date save olanda duzgun vaxtla save olur bazaya  ,ama qayidanda jackson deserializable levelinde ilishir ve 4 saat dala gorsenir swaggerde , bunun helli uchun: bu problem hem @CreationTimestamp ve @UpdateTimestamp da hem de el ile daxil olunan date larda da bash verir app propertiese 2 setr eleve edirik jackson serizable-deserizable emelyati uchun : spring.jackson.serialization.write-dates-with-zone-id=true spring.jackson.time-zone=GMT+4

java ile appden ssl olan hostlara qoshulma uchun sertifikat meselesi

1 ci usul JVM in cacertine elave etmek Windows:  keytool -import -alias cert_alias -file cert.cer -keystore "C:\Program Files\Java\jdk-11.0.9\lib\security\cacerts kodu ise changeit verilir , kod shertidir bashqa sheyde vermek olar lazim olan sertifikati  uygun saydan yukleyirik sora onun kompdaki pathda bu komandi verilir , meselen download foldere dushubse ora gedib yuxaridaki commandi run edirik cmd de Mac: import cert into jvm 17(other versions same as well)  1.  cd /Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home/lib/security  2. sudo keytool -import -file ~/Documents/certs/fusion.cer -keystore /Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home/lib/security/cacerts -alias "fusion" 2 ci usul. appin folderinde trustStore yaradib, jvmi override etmek Yuxaridaki numunelerde serverin certifikati jvm in cacertine elave olunur. Amma jvmin default cacertini override edib , appin ichinde cacert yaratmaq mumkundur: keytool -import -trustcacer...

jpa entitylerde get zamani relationa bagli rekursiyanin mapstruct istifade ederken helli

 mapstructda map ederken ozu arxada ozune lazimi metodlar generate edir, ve bu metodlarin ichinde rekursiya yaradacaq fildleri biz ozumuz ignoe ede bilerik @Mapping(target = "city.stores", ignore = true)     @Mapping(target = "partner.stores", ignore = true)     StoreResponseDto toStoreResponseDto(Store store);     @Mapping(target = "partners", ignore = true)     CategoryResponseDto categoryToCategoryResponseDto(Category category);   burada 1 ci methodu ozum yazmisham dtonun ichinde rekursiyaya sebeb olacaq fileldi ignore edirem , 2 ci metodu ise arxada ozu generate edir ve ordada biz dolayi yolla entity elaqesi ile rekursiyaya dushe bilirik deye partners filedini ignore edirem