스프링 시큐리티를 설정하던 도중 만난 오류이다.

No grammar constraints (DTD or XML Schema) referenced in the document.라는 경고와 함께 발생하였다.

서버에서 DTD에 선언한 http://www.springframework.org/schema/beans에 접근하지 못하는 경우 생기는 에러라고 한다.

에러 발생 시 네임스페이스 

xmlns:beans="http://www.springframework.org/schema/beans"

 수정 후 네임스페이스

xmlns="http://www.springframework.org/schema/beans"

 

문제 해결에 도움이 된 글 : https://gdtbgl93.tistory.com/112

security-context.xml 설정 시 네임스페이스에서 문제가 발생하는 경우 해결법

1. 에러 메세지 (Error Message)

Multiple annotations found at this line:
	- You cannot use a spring-security-2.0.xsd or spring-security-3.0.xsd or spring-security-3.1.xsd schema or spring-security-3.2.xsd schema or spring-security-4.0.xsd schema with Spring 
	 Security 4.2. Please update your schema declarations to the 4.2 schema.
	- Configuration problem: You cannot use a spring-security-2.0.xsd or spring-security-3.0.xsd or spring-security-3.1.xsd schema or spring-security-3.2.xsd schema or spring-security-4.0.xsd 
	 schema with Spring Security 4.2. Please update your schema declarations to the 4.2 schema. Offending resource: file [C:/Users/berry/eclipse-workspace/sendAGift_202005/SendAGift_202005/src/
	 main/webapp/WEB-INF/spring/security-context.xml]

 

2. 해결 전

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-5.0.xsd">

xsi:schemaLocation의 주소를 변경해줍니다.

http://www.springframework.org/schema/security/spring-security-5.0.xsd

아래와 같이 5.0 버전 표기를 삭제합니다.

http://www.springframework.org/schema/security/spring-security.xsd

 

3. 해결 후

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

 

참고 사이트 : https://stackoverrun.com/ko/q/10928899

 

생성자란?

생성자는 특수한 목적을 가지는 메소드로객체가 생성될  자동으로 호출되어 필드를 초기화하는 역할을 한다.

 

생성자가 필요한 이유

-필드를 선언할  초기값을 주게 되면 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 갖게된다.

->객체 생성 시점부터 원하는 초기값을 설정하기 위해 생성자를 사용한다.

 

생성자 작성 형식

접근제한자 메소드이름 ([매개변수]) {

//실행 코드

}



 

특징

-객체 생성  생성자가 호출되지 않으면 예외(에러) 발생한다.

-없으면 컴파일러에서 기본 생성자를 자동으로 제공

-클래스 이름과 동일하고 반환자료형(return type) 없다void표기 조차도 필요 없음

-일반적으로 접근제한자는 public 사용하나private 생성자를 사용하는 경우도 있다. (->private 생성자)

 

기본 생성자

-사용자가 생성자 선언을 하지 않는 경우에만 자동 제공되는 생성자

-객체 생성  자동 호출되는 메소드이므로기본 생성자가 없으면 컴파일러에서 기본 생성자를 자동으로 제공해준다.

-자동으로 생성되는 기본 생성자의 접근 제한은 클래스의 접근 제한과 동일하다. (p260 참고)


매개변수가 있는 생성자 Parameterized Constructor

-생성자에 매개변수를 쓰는 이유 : 외부 전달 받아서 필드를 초기화하기 위한 목적

->기본 생성자 추가로 명시적 선언이 필요  - 매개변수가 있는 생성자 선언  기본 생성자는 자동 제공되지않으므로 기본 생성자와 함께 쓰는 것을 권장한다.


private 생성자 (p260, p243 참고)

->외부에서 객체(instance) 생성하는 과정을 통제하는 수단.

-private 접근제한자는 동일 패키지이건 다른 패키지이건 상관없이 생성자를 호출하지 못하도록 제한하여클래스 외부에서 new 연산자로 객체를 만들  없다.

-클래스 내부에서 정적(static) 메소드를 사용해 객체 생성  제공하도록  

 예Math 클래스 - Math클래스 메소드는 객체(instance)를 선언하지 않아도 사용이 가능하다.

 Math m = new Math(); 라고 선언해보면 The constructor Math() is not visible이라는 메시지

 ->Math클래스의 생성자의 접근제한자는 private인 것을 알 수 있다.

 

 

[참고]생성자와 setter - 생성자와 setter 역할은 비슷하지만 호출 시점이 다르다.

-생성자는 객체 생성  필드 초기화 역할을 수행 - 객체 생성    번만 호출된다.

-setter 객체 생성 이후에 호출이 가능 - 필드 초기화가 아니라 기존값 덮어쓰기객체 생성 이후라면 원하는 때에 언제라도 호출할  있다.

'Java > 노트' 카테고리의 다른 글

[Java] 클래스(Class)의 특징  (0) 2018.07.19

[문제] 여러명의 회원 정보를 전달받고, 출력하는 메소드 선언하기

실행예) 

------------ 

HONG 

010-1234-1234 

20세 

------------ 

PARK 

010-1111-2222 

25세

------------ 

CHOI 

010-5432-4321

22세 


 1. main() 메소드가 있는 실행 클래스

 2. 사용자 정의 자료형 Member 클래스

 3. 출력용 클래스 세 클래스로 나눠서 작성


package com.exam002;

public class Main {
	public static void main(String[] args) {
		//실행 클래스
		//Member 클래스를 사용하기 위해 new연산자를 이용해 객체(instance) 생성
		Member m1 = new Member();
		
		//setter 메소드를 이용해 해당 인스턴스 변수(필드)에 값을 넣어준다.
		m1.setName("고길동");
		m1.setAge(45);
		m1.setPhoneNum("010-0000-0000");

		//마찬가지로 다른 Member 객체(instance)를 생성해서 값을 넣어주자
		Member m2 = new Member();
		Member m3 = new Member();
		
		m2.setName("김둘리");
		m2.setAge(100);
		m2.setPhoneNum("010-1234-5678");
		
		m3.setName("고희동");
		m3.setAge(3);
		m3.setPhoneNum("010-9999-9999");
		
		//Member배열에 각각의 객체(instance) m1, m2, m3를 넣어준다.
		Member[] members = new Member[3]; //크기가 3인 Member자료형(사용자정의자료형) 배열을 선언한다.
		members[0] = m1;
		members[1] = m2;
		members[2] = m3;
		
		//출력
		Test t = new Test();
		t.printMembers(members); //매개변수로 사용자정의자료형인 Member배열을 넘겨준다.
		
	}
}
package com.exam002;

public class Member {
	//자료형 클래스 : 자료를 저장하는 Member 클래스
	
	//필드 field
	private String name;
	private int age;
	private String phoneNum;
	
	//getter, setter 메소드 - 다른 클래스에서도 접근할 수 있도록 접근제한자는 public
        //getName 메소드를 다른 곳에서 호출하면 이 클래스의 필드의 name변수에 저장된 값을 돌려준다.
	public String getName() {
		return this.name; 
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return this.age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
	
	public String getPhoneNum() {
		return this.phoneNum;
	}
	
	public void setPhoneNum(String phoneNum) {
		this.phoneNum = phoneNum;
	}
	
}
package com.exam002;

public class Test {
	//액션 클래스 - 출력용 메서드 작성
	
	//매개변수로 배열을 받아서 출력하는 형태로 작성
	public void printMembers(Member[] members) {
		
		//향상된 for문(Enhanced for loop) 사용
		//배열 members에 들어있는 값을 처음부터 끝까지 차례차례 하나씩 꺼내서 선언된 변수에 m에 담아서 출력한다.
		//주의 : 배열에서 사용. 요소를 참조할 때만 사용하는 것이 좋으며, 요소의 값을 변경하는 작업에는 적합하지 않다.
		for(Member m : members) {
			System.out.println("------------");
			System.out.println(m.getName());
			System.out.println(m.getAge()+"세");
			System.out.println(m.getPhoneNum());
		}
	}
	
	
}

실행 결과

------------
고길동
45세
010-0000-0000
------------
김둘리
100세
010-1234-5678
------------
고희동
3세
010-9999-9999


+ Recent posts