반응형
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call

 

JpaRepository 사용하여 delete를 하는데 해당 오류가 발생하였다. 

 

JPA에서는 데이터베이스 트랜잭션 내에서 작동한다고 한다. 

 

이렇게 작동하는 JPA는 트랜잭션은 커밋이나 롤백을 하지 않으면 영속성 컨텍스트에만 저장이된다.

(*** 영속성 컨텍스트 : JPA에서 엔티티 객체를 보관 및 관리하는 환경)

 

즉, 데이터베이스에 엔티티 객체가 저장이 되지 않는다.

 

@Transactional 어노테이션을 사용하면  JPA의 트랜잭션을 자동으로 시작하고, 커밋 또는 예외발생시 롤백 등을 수행할 수 있다.

 

그러므로 해당 오류는 delete하는 repository를 호출하는 서비스에서 @Transactional 어노테이션을 추가해주고 서버를 재기동해주니 삭제가 정상적으로 되는것을 확인하였다.

반응형
반응형
<if test="exVO.isYn == 'y'">

 

이부분에서 오류가나는데...

 

너무 오랜만에해서그런가.. 따옴표의 문제일줄은 몰랐다...

 

<if test='exVO.isYn == "y"'>

 

반응형
반응형

운영하는 서버에서 파일다운로드 받기위해 url요청을하면 다른서버의 파일다운로드 받아오는 부분에서 해당 오류가 발생하였다.

 

I/O error on POST request for "": Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out

 

구글링을 통해 여러방법을 몇시간 삽질했지만 나의 경우에는 해당 파일이 존재하지 않아서 발생하였다.

 

DB에 있는 파일정보의 파일인덱스를 요청해서 다운로드 요청한 것이었는데, 해당 파일이 당시 어떤 오류로인한 업로드처리가 안됬었던 모양.

 

리눅스서버의 파일업로드경로를 가보니 해당파일이 존재하지 않는것을 확인한 후..

 

서버에 존재하는 파일의 파일인덱스를 요청해서 확인해보니 다운로드가 잘되는 것을 확인하였다. 

 

결국 파일이 존재하지 않아서 다운로드할 파일이 없어서 타임아웃이 된 것이었다.

반응형
반응형

 

query did not return a unique result: 3

해당오류는 select 결과를 VOclass형태로 받는 부분에서 오류가 났다

 

VOclass return = repository.findByXXX(param);

 

select 결과가 row 수가 3인데 List<VOclass> 형태로 받지않고 VOclass로 받아서 생긴 오류였다.

 

만약에 select 결과가 여러 row를 받는게 맞으면 List<VOclass>형태로 타입을 변경해주면되고,

 

아니면 관련 여러 row가 나오지않도록 소스코드를 수정하고 필요없는 데이터는 삭제해주면된다.

 

반응형
반응형
[2023-01-09 10:12:02,459] Artifact Gradle : com.test : ROOT.war (exploded): Artifact is being deployed, please wait...
[2023-01-09 10:12:02,479] Artifact Gradle : com.test : ROOT.war (exploded): Error during artifact deployment. See server log for details.
[2023-01-09 10:12:02,480] Artifact Gradle : com.test : ROOT.war (exploded): com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException: D:\projects\testProject\build\libs\exploded\ROOT.war not found for the web module.

 

지난주까지 잘 실행되던 프로젝트가 톰캣실행시

 

위와 같은 해당오류를 뿜고 정상적으로 구동이 안되는 현상이 발생하였다.

 

인텔리제이 설정이 초기화 된건지 구글링을 통해 설정값을 변경해주었더니 해당 오류없이 프로젝트가 잘 실행되었다

 

File → Settings → Build, Execution, Deployment → Build Tools → Gradle 

 

 

위 스크린샷과 같이 Build and run using 부분이 Gradle로 되어있다면 IntelliJ IDEA로 설정 후 Apply하고,

 

톰캣을 재기동하자

 

반응형
반응형

CentOS7 개발서버 구축후 jdk, tomcat, mariadb 설치하였다.

 

mariadb 10.4.27 설치 후 재시작을 했는데, 아래와 같은 오류가 발생하였다.

 

...

Dec 20 00:21:49 localhost.localdomain mysqld[22947]: 2022-12-20 0:21:49 0 [ERROR] Can't start server: Bind on TCP/IP port. Got error: 13: Permission denied 
Dec 20 00:21:49 localhost.localdomain mysqld[22947]: 2022-12-20 0:21:49 0 [ERROR] Do you already have another mysqld server running on port: 4321 ? 
Dec 20 00:21:49 localhost.localdomain mysqld[22947]: 2022-12-20 0:21:49 0 [ERROR] Aborting

...

 


 

첫번째로 문제의 4321 포트를 확인하려고 다음과 같이 명령어 날렸지만

# netstat -nptl | grep 4321
-bash: netstat: command not found

 

설치되지 않아 

# yum install net-tools

 

위와 같이 설치 완료. 설치 후 4321 포트를 사용중인 프로세스는 없는 것으로 확인!

 


두번째로 semanage 명령어를 사용하여 mysql 사용 포트를 추가하기

# yum install -y policycoreutils-python

 

현재 포트 확인 및 4321 포트 추가후 재확인

# semanage port -l | grep mysqld_port_t
mysqld_port_t tcp 1186, 3306, 63132-63164
# semanage port -a -t mysqld_port_t -p tcp 4321
# semanage port -l | grep mysqld_port_t
mysqld_port_t tcp 4321, 1186, 3306, 63132-63164

 


세번째로 mysql 재시작

# systemctl restart mariadb

 

정상구동 확인하였다. 

반응형
반응형

객체에 toString()을 하면 원하는 문자열이 나와야할 것 같은데

 

어쩔땐 원하는 문자열이 나오고, 어쩔땐 클래스명과  16진수 형태로 나온다.

 

클래스명@16진수 형태로 나오는 경우는 toString메서드를 오버라이드(재정의)하지 않아,

 

모든 클래스의 최상위 조상인 Object의 toString메서드를 호출하기 때문이다.

 

아래 코드는 Object클래스의 toString메서드 부분이다.

 

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

 

클래스를 새로 생성하면 디버깅을 위해서라도 클래스의 정보들을 잘 드러낼 수있도록,

 

원하는 내용으로 재정의를 하는 것이 좋겠다.

(아래는 간단히 변수에 대한 정보를 가져오는 toString메서드 오버라이딩 예시)

 

    @Override
    public String toString() {
        return "변수 = " + 변수;
    }

 

반응형
반응형

400 505번 http error code 출력되는 취약점 발생했다.

 

톰캣/conf/web.xml에

 

<error-code>400</error-code>
    <location>/error.html</location>
</error-page>
<error-page>
    <error-code>401</error-code>
    <location>/error.html</location>
</error-page>
<error-page>
    <error-code>403</error-code>
    <location>/error.html</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/error.html</location>
</error-page>
<error-page>
    <error-code>405</error-code>
    <location>/error.html</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error.html</location>
</error-page>
<error-page>
    <error-code>501</error-code>
    <location>/error.html</location>
</error-page>

 

정의를 하고 server.xml파일의 docBase에 error.html을 넣었는데 404는 error.html이 제대로 나오는데

 

400에러는 톰캣 디폴트 에러페이지가 나온다.

 

 

400에러나 505에러의 경우에는 버전에따라 적용이 안되는건지

 

톰캣/conf/server.xml에

<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false"
errorCode.0="{경로}/error.html" />

 

위와같이 추가하니 적용이됬다(0은 기본 오류페이지이고, 0대신 에러코드를 지정해서 적용할 수 있다.)

 

errorCode 속성은 현재 프로젝트의 톰캣 8.5.82기준 지원하고있다. (몇버전부터인지는 잘..)

https://tomcat.apache.org/tomcat-8.5-doc/config/valve.html

 

Apache Tomcat 8 Configuration Reference (8.5.84) - The Valve Component

When using mod_jk or mod_proxy_ajp, the client's session id is used to determine which back-end server will be used to serve the request. If the target node is being "drained" (in mod_jk, this is the DISABLED state; in mod_proxy_ajp, this is the Drain (N)

tomcat.apache.org

 

반응형

+ Recent posts