Posts

Showing posts from July, 2023

getRootConfigClasses and getServletConfigClasses

 1. SecurityConfig.class 是在 getRootConfigClasses 中設定。 2. WebAppConfig.class 是在 getServletConfigClasses 中設定。 3. DataSourceConfig.class 是在 getRootConfigClasses 中設定。 4. HibernateConfig.class 是在 getRootConfigClasses 中設定。 1) 在GenApplication當中的@Import要設定哪些configuration classes? 要解釋 在GenApplication類別中的@SpringBootApplication註解已經隱含了多個設定,包括@ComponentScan和@EnableAutoConfiguration。通常情況下,不需要額外進行@Configuration的@Import設定。因此,在GenApplication中不需要設定其他configuration classes。 2) SpringMvcDispatcherServletInitializer當中的return new Class[]{}是什麼configuration classes? 要解釋 在SpringMvcDispatcherServletInitializer類別中,我們繼承了AbstractAnnotationConfigDispatcherServletInitializer並且實現了getRootConfigClasses和getServletConfigClasses方法。 - getRootConfigClasses方法應該返回帶有@Configuration註解的configuration classes。這些classes將會配置應用程序的根ApplicationContext,通常是一些服務、資料庫等等。 - getServletConfigClasses方法應該返回帶有@Configuration註解的configuration classes。這些classes將會配置DispatcherServlet的ApplicationContext,通常是一些控制器、視圖解析器等等。 目前在SpringMvcDispatcherServletIniti

Java Spring Boot AOP

在 Spring Boot 2.7.14 版本中,你可以使用 Java 配置類的方式來實現在 Spring Boot 應用程序中添加 AOP 的效果,替代 XML 配置。在 Java 配置類中,你需要完成以下步驟: 1. 創建一個 Aspect 類,其中包含需要植入的橫切關注點(cross-cutting concerns)邏輯。 2. 創建一個配置類,用於啟用 AspectJ 自動代理支持。 以下是具體的步驟: Step 1: 創建 Aspect 類 ```java package com.example.aspect; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class MyAspect {          @Before("execution(* com.example.controller.*.*(..))")     public void beforeControllerMethods() {         // 在這裡編寫在目標方法執行前執行的邏輯         System.out.println("Before executing controller methods...");     } } ``` 上述代碼中,我們創建了一個名為 `MyAspect` 的 Aspect 類,它通過 `@Aspect` 註解標記為一個 Aspect,並使用 `@Component` 註解使其成為 Spring 託管的組件。在 `beforeControllerMethods` 方法中,我們使用 `@Before` 註解定義了一個切入點,該切入點將在 `com.example.controller` 包中所有方法執行前執行,你可以根據自己的需求修改切入點表達式。 Step 2: 創建配置類 ```java package com.example.config; import org.springframework.context.annota

spring application.xml spring.jpa.hibernate.ddl-auto

spring.jpa.hibernate.ddl-auto = update spring.jpa.hibernate.ddl-auto = create 在Spring Boot项目中,`spring.jpa.hibernate.ddl-auto`是一个配置属性,用于指定Hibernate在启动时自动执行数据库模式的动作。这个属性通常在`application.properties`或`application.yml`中设置,用于管理数据库模式(表结构)的创建和更新。 1. `spring.jpa.hibernate.ddl-auto = update`: 当设置为`update`时,Hibernate会在启动时检查数据库模式(表结构)与当前的实体类定义之间的差异,并自动更新数据库以反映这些差异。这意味着如果数据库中不存在某个表或某些字段,Hibernate会自动创建它们。如果实体类的定义发生更改,例如添加新字段或更改字段类型,Hibernate也会相应地修改数据库模式。 请注意,`update`操作是谨慎的,并且在生产环境中需要小心使用。它可能会导致数据丢失或不可预料的结果。在生产环境中,通常不建议使用`update`,而是手动执行数据库迁移工具来控制数据库模式的更新。 2. `spring.jpa.hibernate.ddl-auto = create`: 当设置为`create`时,Hibernate会在启动时删除数据库中的所有表,并重新创建它们,以及相应的关系和约束。这意味着每次应用程序启动时,数据库中的数据都会被清空,并根据实体类的定义重新创建。这种设置通常用于开发和测试环境,在每次应用程序重新启动时重新构建数据库结构。 请注意,`create`操作会导致数据丢失,因为每次启动时都会清空数据库。在生产环境中,绝对不应该使用`create`,因为它会导致生产数据丢失。 总结:在生产环境中,通常推荐将`spring.jpa.hibernate.ddl-auto`设置为`none`,这样Hibernate不会自动执行任何数据库模式的更改。而是使用数据库迁移工具(如Flyway或Liquibase)来管理数据库结构的变更,以确保数据的完整性和持久性。 示例配置: ```properties # application.

Spring Boot Starters

Spring Boot Starters Spring Initializr Dependencies: Spring Web Spring Security Spring Data JPA Thymeleaf MySQL Driver Lombok =================Eclipse=============== Java Build Path: JRE System library->add library -> Server Runtime Pom.xml 註冊org.apache.commons,jackson-core-2.15.2,jackson-annotations-2.15.2,jackson-databind-2.15.2,gson 2.10.1 com.google.code.gson gson 2.10.1 com.fasterxml.jackson.core jackson-core 2.15.2 com.fasterxml.jackson.core jackson-annotations 2.15.2 com.fasterxml.jackson.core jackson-databind 2.15.2 4.0.0 com.google.code.gson gson 2.10.1 com.fasterxml.jackson.core jackson-core 2.15.2 com.fasterxml.jackson.core jackson-annotations 2.15.2 com.fasterxml.jackson.c

Spring Starter

  Eclipse是一款流行的統合開發環境(IDE),用於開發Java和其他編程語言的應用程序。在Eclipse中創建Spring Starter專案,您需要使用Spring Tools插件。以下是在Eclipse中安裝和使用Spring Starter功能的步驟: 步驟1:安裝Spring Tools插件 打開Eclipse IDE。 轉到“Help”(幫助)菜單。 選擇“Eclipse Marketplace”(Eclipse市場)。 在“Find”(查找)欄中,輸入“Spring Tools”並按Enter鍵進行搜索。 在搜尋結果中,找到“Spring Tools 4”,然後點擊“Install”(安裝)按鈕。 完成插件的安裝過程,並重新啟動Eclipse。 步驟2:創建New Spring Starter專案 打開Eclipse IDE。 轉到“File”(文件)菜單。 選擇“New”(新建)> “Other”(其他)。 在彈出的對話框中展開“Spring”文件夾,然後選擇“Spring Starter Project”(Spring Starter專案)。 點擊“Next”(下一步)。 步驟3:配置Spring Starter專案 在“New Spring Starter Project”對話框中,您可以配置專案的相關細節: “Name”(名稱):輸入專案的名稱。 “Group”(組):定義專案的Group ID。 “Artifact”(組件):定義專案的Artifact ID。 “Version”(版本):指定專案的版本號。 “Package”(包):設定Java包的根目錄。 “Packaging”(封裝方式):選擇專案的封裝方式,通常是JAR或WAR。 “Java”:選擇Java版本。 “Language”(語言):選擇主要的程式語言,通常是Java。 “Dependencies”(依賴項):選擇您希望在專案中使用的Spring相關依賴項。 完成配置後,點擊“Finish”(完成)。 現在,您已經在Eclipse中成功創建了一個Spring Starter專案。您可以開始編寫和開發Spring應用程序了。請注意,Spring Tools插件的界面和功能可能在新的版本中有所變化,所以如果我們的步驟和您的Eclipse版本不符,請參考插件的官方文檔或

javax.servlet.http.HttpServlet

The superclass "javax.servlet.http.HttpServlet", determined from the Dynamic Web Module facet version (3.1), was not found on the Java Build Path 這個錯誤訊息表示您的Java Web應用程式專案缺少"javax.servlet.http.HttpServlet"這個類別的依賴。通常這個問題是由於缺少Servlet API的JAR檔案或專案設定不正確造成的。要解決這個問題,您可以按照以下步驟進行修復: 1. 確認您有Servlet API的JAR檔案:通常,Servlet API JAR檔案包含在Java EE或Java Servlet容器中,如Apache Tomcat或Eclipse Jetty。請確保您的專案中有這些JAR檔案。 2. 確認Servlet API JAR檔案在Java Build Path中:在Eclipse中,您需要確保專案的Java Build Path包含了Servlet API JAR檔案。可以按照以下步驟來添加它:    a. 在Eclipse中,導航到專案資料夾,然後右鍵點擊專案。    b. 選擇"Properties" (屬性)。    c. 在左側面板中,選擇"Java Build Path" (Java建置路徑)。    d. 在右側的"Libraries" (函式庫)分頁中,確認是否有"Apache Tomcat"或其他Servlet容器的庫。如果沒有,可以選擇"Add Library" (新增庫)來添加Servlet容器庫。    e. 如果您已經擁有Servlet API JAR檔案,則可以選擇"Add JARs" (新增JAR檔案)或"Add External JARs" (新增外部JAR檔案),然後選擇相應的Servlet API JAR檔案。 3. 確認專案的動態Web模組面向版本設定正確:請確保專案的動態Web模組面向版本設定與您實際使用的Servlet容器版本相符。您的錯誤訊息中顯示為&qu

Javascript file editing stopped working with Eclipse 2020-06

Image
  20 The  Eclipse IDE for PHP Developers  is made up of components from various Eclipse projects. In the  Eclipse IDE 2020-06  release the  JavaScript support  for  .js  file is  no longer  provided by the JavaScript editor from  JSDT , but by  Eclipse Wild Web Developer . Wild Web Developer  does  not  provide a  separate Editor  for JavaScript, but  extends  the  Generic Text Editor  by code completion, syntax highlighting, validation, navigation, etc.  for JavaScript . To  get back the JSDT JavaScript editor  you have to  uninstall  Eclipse Wild Web Developer  and  install  JavaScript Development Tools  from the Eclipse IDE  2020-03  release (I guess the problems if you had both were solved by simply removing or disabling the JavaScript editor in the 2020-06 release): Uninstall  Eclipse Wild Web Developer : In  Help > About Eclipse IDE: Installation Details , in the  Installed Software  tab select  Eclipse Wild Web Developer  and click  Uninstall... Install  JavaScript Developmen

MYSQL DB 出問題 Error Code: 1010. Error dropping database (can't rmdir '.\bookgendb', errno: 41)

 這個錯誤代表在嘗試刪除名為"bookgendb"的資料庫時出現了問題。具體來說,錯誤代碼1010表示無法刪除目錄,而errno: 41表示目錄非空,無法刪除。 這通常發生在資料庫目錄下存在其他檔案或目錄的情況下,MySQL無法刪除整個資料庫目錄。要解決此問題,您可以按照以下步驟進行操作: 1. 確保您有足夠的權限執行刪除操作。您需要擁有足夠的權限才能刪除資料庫。 2. 確保在刪除資料庫之前,該資料庫已經不存在於MySQL中。您可以使用SHOW DATABASES;查詢現有的資料庫列表,確認"bookgendb"已經不存在。 3. 確認目錄下沒有其他的檔案或目錄。您可以使用操作系統的檔案總管或命令列工具,進入MySQL資料庫目錄(通常在MySQL的資料庫目錄下的"data"子目錄),並確認該目錄下只有與"bookgendb"相關的檔案和目錄。如果有其他檔案或目錄存在,請先將它們刪除。 4. 如果您確定沒有其他檔案或目錄存在於"bookgendb"目錄下,而且您有足夠的權限,但仍然無法刪除資料庫,那麼可能是由於操作系統層面的問題。請確保MySQL伺服器進程具有足夠的權限刪除該目錄。 ==================================================================== 錯誤代碼1010表示無法刪除資料庫目錄,而errno: 41表示目錄非空,無法刪除。這意味著在嘗試刪除資料庫之前,資料庫目錄中可能還有其他檔案或目錄存在。 為了解決這個問題,您可以執行以下步驟: 1. 確保您有足夠的權限進行刪除操作。您需要擁有足夠的權限才能刪除資料庫。 2. 使用SHOW DATABASES;確認"bookgendb"資料庫存在。如果資料庫不存在,則無需進一步處理。 3. 確認該資料庫下的所有資料表都已經刪除。您可以使用以下SQL語句來確認資料庫中的資料表:    ```    USE bookgendb;    SHOW TABLES;    ```    如果資料庫中仍然有資料表存在,請先刪除所有資料表,然後再嘗試刪除資料庫。 4. 如果您確定資料庫中沒有任何資料表存在,但仍然無法刪除資料庫,那麼可能是由於操作系統

Could not obtain transaction-synchronized Session problem (fixed)

 以下程式最大問題是 createRandomAbstract 没有加  @Override @Transactional 修改以下CODE 便能解決問題           @Override @Transactional public void createRandomAbstract( int theId ) { Book book = bookDao .getBook( theId ); Abstractpara abstractpara = new Abstractpara(); abstractpara .setContent( "test 2" ); abstractpara .setLanguage( "English" ); abstractpara .setBook( book ); book .addAbstractpara( abstractpara ); book = bookDao .saveBook( book ); } ====================================== package com.book.gen.domain.services.aggregates; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional ; import com.book.gen.domain.aggregates.repositories.BookAbstractparaDao; import com.book.gen.domain.models.*; import com.book.gen.domain.models.repositories.AbstractparaDao; import com.book.gen.domain.models.repositories.BookDao; @Service public cl