26 Aralık 2023 Salı

Bean Validation @GroupSequence Anotasyonu

Örnek
Elimizde şöyle bir kod olsun
public class SampleRequest {

  @NotNull
  LocalDate startDate;

  @NotNull
  LocalDate endDate;

  @AssertTrue(message = "Start date is after the end date")
  public boolean isEndDateAfterStartDate() {
    return !endDate.isBefore(startDate);
  }
}
Jakarta Constraint anotasyonları rastgele sırada yani karışık sırada çalışıyor. Bu yüzden endDate alanı null ise @NotNull'dan önce @AssertTrue çalışabilir ve NullPointerException alırız. Bunu önlemek için  Jakarta'ya bir sıralama belirtmek gerekir. Bunun için @GroupSequence Anotasyonu kullanılır. Buna Validation Groups deniliyor.  

Şöyle yaparız. Önce groups değerine sahip olmayanlar daha sonra da groups olarak DateExtendedValidation değerine sahip olan Constraint anotasyonları çalıştırılır
// introduce the flag interface for group marking
public interface DateExtendedValidation {}

@GroupSequence({SampleRequest.class, DateExtendedValidation.class})
public class SampleRequest {
  
  @NotNull
  LocalDate startDate;

  @NotNull
  LocalDate endDate;

  @AssertTrue(message = "Start date is after the end date",
              groups = DateExtendedValidation.class)
  public boolean isEndDateAfterStartDate() {
    return !endDate.isBefore(startDate);
  }
}



Bean Validation @AssertTrue Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.validation.constraints.AssertTrue;
Metodun true döndüğünü kontrol eder. Açıklaması şöyle
data-time fields (@Future, @Past, @FutureOrPresent, @PastOrPresent);
strings (@Email, @Pattern, @Size, @NotEmpty);
iterative objects (@Size, @NotBlank)
numeric values (@Digits, @Min and @Max, @Negative, @Positive)
boolean values (@AssertTrue, @AssertFalse)
objects (@Null, @NotNull, @Valid)

Örnek
Şöyle yaparız.
@AssertTrue(message = "name checked")
public boolean isNameCheck() { 
  if (this.name == null || (this.name != null && this.name.length() <= 5)) { 
    return true; 
  }

  return false;
}
Örnek
Şöyle yaparız.
@AssertTrue(message = "Your custom message")
public boolean checkValidation(){
  if(site != null && app != null){
    return false;
  }

  //add ur required condition here. if ur request valid return true.
  return false;
}

Bean Validation @FutureOrPresent Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.validation.constraints.FutureOrPresent;
Şu tipler ile kullanılabilir
java.util.Date
java.util.Calendar
java.time.Instant
java.time.LocalDate
java.time.LocalDateTime
java.time.LocalTime
java.time.MonthDay
java.time.OffsetDateTime
java.time.OffsetTime
java.time.Year
java.time.YearMonth
java.time.ZonedDateTime
java.time.chrono.HijrahDate
java.time.chrono.JapaneseDate
java.time.chrono.MinguoDate
java.time.chrono.ThaiBuddhistDate

Örnek - Date
Şöyle yaparız.
@NotNull
@FutureOrPresent
@Column(name = "meeting_start")
private Date start;

Bean Validation API @Future Anotasyonu

Giriş
Açıklaması şöyle
data-time fields (@Future, @Past, @FutureOrPresent, @PastOrPresent);
strings (@Email, @Pattern, @Size, @NotEmpty);
iterative objects (@Size, @NotBlank)
numeric values (@Digits, @Min and @Max, @Negative, @Positive)
boolean values (@AssertTrue, @AssertFalse)
objects (@Null, @NotNull, @Valid)

12 Ekim 2023 Perşembe

RabbitMQ Client Kullanımı

Örnek
Şu satırı dahil ederiz
<dependency>
<groupId>org.testcontainers</groupId> <artifactId>testcontainers</artifactId> <version>${testcontainers.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.testcontainers</groupId> <artifactId>rabbitmq</artifactId> <version>${testcontainers.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>com.rabbitmq.jms</groupId> <artifactId>rabbitmq-jms</artifactId> <version>3.1.0</version> </dependency>
Şöyle yaparız
import com.rabbitmq.jms.admin.RMQConnectionFactory;
import org.testcontainers.containers.RabbitMQContainer;
import jakarta.jms.ConnectionFactory;


RabbitMQContainer rabbitMQContainer = new RabbitMQContainer("rabbitmq:3.8");
rabbitMQContainer.start();

RMQConnectionFactory f = new RMQConnectionFactory();
f.setUri(rabbitMQContainer.getAmqpUrl());
...
rabbitMQContainer.stop();

17 Eylül 2023 Pazar

Embedded Tomcat

Giriş
Şu satırı dahil ederiz.
<dependency>
  <groupId>org.apache.tomcat.embed</groupId>
  <artifactId>tomcat-embed-core</artifactId>
  <version>${tomcat.version}</version>
</dependency>
Tomcat Sınıfı
addServlet metodu
Şöyle yaparız.
Tomcat tomcat = new Tomcat();
tomcat.setPort(8082);
tomcat.addContext("/", "/web");
Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());

Tomcat.addServlet(ctx, "Embedded", new HttpServlet() {
  @Override
  protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException {

    Writer w = resp.getWriter();
    w.write("Embedded Tomcat servlet.\n");
    w.flush();
    w.close();
  }
});

ctx.addServletMappingDecoded("/*", "Embedded");

tomcat.start();
tomcat.getServer().await();
setBaseDir metodu
Örnek
Şöyle yaparız
import org.apache.catalina.Wrapper;
import org.apache.catalina.startup.Tomcat;

public class TomcatEmbedded {

  public static void main(String... args) throws Exception {
    File baseFolder = new File(System.getProperty("user.dir"));
    File appsFolder = new File(baseFolder, "apps");

    Tomcat tomcat = new Tomcat();
    tomcat.setBaseDir(baseFolder.getAbsolutePath());
    tomcat.setPort(8080);
    tomcat.getHost().setAppBase(appsFolder.getAbsolutePath());

    // Call the connector to create the default connector.
    tomcat.getConnector();

    tomcat.addWebapp("", ".");
    Wrapper wrapper = tomcat.addServlet(EMPTY, "hello", new HelloServlet());
    wrapper.setLoadOnStartup(1);
    wrapper.addMapping("/*");

    tomcat.start();
    tomcat.getServer().await();
  }

  private static class HelloServlet extends HttpServlet {
    ...
}

getService metodu
Elimizde şöyle bir kod olsun
public class CustomLoggerValve extends ValveBase {
  private static final Logger logger = LoggerFactory.getLogger(CustomLoggerValve.class);

  @Override
  public void invoke(Request request, Response response)
  throws IOException, ServletException {
    try {
      MDC.put("requestId", UUID.randomUUID().toString());
      logger.info("Received request");
      getNext().invoke(request, response);
    } finally {
      MDC.remove("requestId");
    }
  }
}
Şöyle yaparız
Tomcat tomcat = // ... your tomcat setup
tomcat.getService().getContainer().getPipeline().addValve(new CustomLoggerValve());

Bean Validation @GroupSequence Anotasyonu

Örnek Elimizde şöyle bir kod olsun public class SampleRequest {   @NotNull   LocalDate startDate;   @NotNull   LocalDate endDate;   @AssertT...