[~톰캣경로]/lib

java -cp catalina.jar org.apache.catalina.util.ServerInfo

버전 확인 완.

[자격증] SQLD 자격증 드디어 합격 - 2년 만기 자격증 영구 전환을 위한 보수교육 

SQLD 자격증을 드디어 취득했습니다.

처음 응시했던 건 첫 취준 때 자격증 하나라도 늘려보자 해서 응시했던 기억이 나네요

그 때가 23회 시험이었는데
중간에 한 번 더 신청했는데 시험 일정이 여의치 않아서 또 실패.
이번에 언제가 될지 모르는 이직을 위해 다시 응시했습니다.
41회 합격~

그렇게 어려운 시험도 아닌데 이렇게 15만원이나 주고 합격하다니ㅜㅜ
 저는 정보처리기사도 여러 번 떨어지고 최종합격 해가지고..
자격증시험을 잘 못 보나 싶기도 하고.. ㅎㅎ

 

-

자격증에 유효기간(2021.06.25~2023.06.25) 이 있어 FAQ를 찾아보니 아래와 같은 답변이 있었다.

https://www.dataq.or.kr/www/board/view.do

 

데이터자격시험

 

www.dataq.or.kr

 

보수교육은 마이페이지에 내용이 나오는 것 같다.

 1년 6개월 후에 다시 보수교육을 받아야겠다~

 

SQLD 시험 준비하시는 모두 화이팅입니다~

 

[구매후기] 다이소 악력기

여름이 오고, 점점 옷 소매가 짧아지면서
늘어나는 팔뚝살과 힘을 잃은 손목을 튼튼하게 보강해주기 위해 운동을 해야겠다고 생각하다가

다이소에서 악력기를 발견! 해서 구매했습니다.


 

밸브를 이용해서 5kg~25kg 강도를 조절할 수 있게 되어 있는데
5kg는 운동 안하는 여성인 제가 해도 할만 하더라고요

근데 한 10kg쯤이면 빡빡하군.. 싶은 정도..

색상은 핑크, 그레이, 블루가 있는 것 같았는데
제가 방문한 지점은 핑크 밖에 없어서 핑크를 구매했어요~

 

나사타입이라 정확한 악력을 알순 없고 대충 이정도겠다~~ 하면서 하게 되는 듯

 

악력기하고 나니까
뻐근하던 어깨도 좀 가벼워진 거 같은 기분이 들어요

평소에 운동을 얼마나 안하면..^_^;;

 

다이소 악력기와 함께 힘을 길러보겠습니다.. 아자아자..

모두들 건강하세요~

HtmlEscapingObjectMapperFactory.java 생성

package com.abc.cmmn.web;

import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.beans.factory.FactoryBean;
import com.fasterxml.jackson.core.SerializableString;
import com.fasterxml.jackson.core.io.CharacterEscapes;
import com.fasterxml.jackson.core.io.SerializedString;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class HtmlEscapingObjectMapperFactory implements FactoryBean<ObjectMapper> {

	private final ObjectMapper objectMapper;

	public HtmlEscapingObjectMapperFactory() {
		objectMapper = new ObjectMapper();
		objectMapper.getFactory().setCharacterEscapes(new HTMLCharacterEscapes());
		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
	}

	@Override
	public ObjectMapper getObject() throws Exception {
		return objectMapper;
	}

	@Override
	public Class<?> getObjectType() {
		return ObjectMapper.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}

	public static class HTMLCharacterEscapes extends CharacterEscapes {

		private static final long serialVersionUID = 1L;
		private final int[] asciiEscapes;

		public HTMLCharacterEscapes() {
			// start with set of characters known to require escaping (double-quote,
			// backslash etc)
			asciiEscapes = CharacterEscapes.standardAsciiEscapesForJSON();
			// and force escaping of a few others:
			asciiEscapes['<'] = CharacterEscapes.ESCAPE_CUSTOM;
			asciiEscapes['>'] = CharacterEscapes.ESCAPE_CUSTOM;
			asciiEscapes['&'] = CharacterEscapes.ESCAPE_CUSTOM;
			asciiEscapes['"'] = CharacterEscapes.ESCAPE_CUSTOM;
			asciiEscapes['\''] = CharacterEscapes.ESCAPE_CUSTOM;
		}

		@Override
		public int[] getEscapeCodesForAscii() {
			return asciiEscapes;
		}

		// and this for others; we don't need anything special here
		@Override
		public SerializableString getEscapeSequence(int ch) {
			return new SerializedString(StringEscapeUtils.escapeHtml4(Character.toString((char) ch)));
		}
	}
}

 

dispatcher-servlet.xml 에 bean 추가

 

<bean id="htmlEscapingObjectMapper" class="com.abc.cmmn.web.HtmlEscapingObjectMapperFactory" />
	<mvc:annotation-driven>
		<mvc:message-converters>
			<bean
				class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
				<property name="objectMapper"
					ref="htmlEscapingObjectMapper"></property>
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>

 

pom.xml

		<dependency>
			<groupId>com.navercorp.lucy</groupId>
			<artifactId>lucy-xss-servlet</artifactId>
			<version>2.0.0</version>
		</dependency>

 

/resources 하위에 lucy-xss-servlet-filter-rule.xml 생성

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.navercorp.com/lucy-xss-servlet">
   <defenders>
       <!-- XssPreventer 등록 -->
       <defender>
           <name>xssPreventerDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssPreventerDefender</class>
       </defender>
 
       <!-- XssSaxFilter 등록 -->
       <defender>
           <name>xssSaxFilterDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssSaxFilterDefender</class>
           <init-param>
               <param-value>lucy-xss-sax.xml</param-value>   <!-- lucy-xss-filter의 sax용 설정파일 -->
               <param-value>false</param-value>        <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
           </init-param>
       </defender>
 
       <!-- XssFilter 등록 -->
       <defender>
           <name>xssFilterDefender</name>
           <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssFilterDefender</class>
           <init-param>
               <param-value>lucy-xss.xml</param-value>    <!-- lucy-xss-filter의 dom용 설정파일 -->
               <param-value>false</param-value>         <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 -->
           </init-param>
       </defender>
   </defenders>
 
    <!-- default defender 선언, 별다른 defender 선언이 없으면 default defender를 사용해 필터링 한다. -->
    <default>
        <defender>xssPreventerDefender</defender>
    </default>
 
    <!-- global 필터링 룰 선언 -->
    <global>
        <!-- 모든 url에서 들어오는 globalParameter 파라메터는 필터링 되지 않으며 
                또한 globalPrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
        <params>
            <param name="globalParameter" useDefender="false" />
            <param name="globalPrefixParameter" usePrefix="true" useDefender="false" />
        </params>
    </global>
 
    <!-- url 별 필터링 룰 선언 -->
    <url-rule-set>
       
       <!-- url disable이 true이면 지정한 url 내의 모든 파라메터는 필터링 되지 않는다. -->
       <url-rule>
           <url disable="true">/disableUrl1.do</url>
       </url-rule>
       
        <!-- url1 내의 url1Parameter는 필터링 되지 않으며 또한 url1PrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. -->
        <!-- <url-rule>
            <url>[처리하는 url].do</url>
            <params>
                <param name="[파라미터명]" useDefender="false" />
            </params>
        </url-rule> -->
        
    </url-rule-set>
</config>

 

web.xml 에 encodingFilter 항목을 찾아서

 <filter-mapping> 
    <filter-name>encodingFilter</filter-name> 
    <url-pattern>*.do</url-pattern> 
  </filter-mapping>

다음에 추가해줌.

    <filter>
		<filter-name>multipartFilter</filter-name>
		<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>multipartFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter> 
		<filter-name>xssEscapeServletFilter</filter-name> 
		<filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class> 
	</filter> 
	<filter-mapping> 
		<filter-name>xssEscapeServletFilter</filter-name> 
		<url-pattern>/*</url-pattern> 
	</filter-mapping>
  <filter>

 

tomcat 서버에서 server.xml 에  allowCasualMultipartParsing="true" 를 추가해줌.

 <Context docBase="ProjectName" path="/" allowCasualMultipartParsing="true" reloadable="true" source="org.eclipse.jst.jee.server:ProjectName"/></Host>

 

tomcat 서버 context.xml 에 추가하는 방식도 있다고 함.

<Context allowCasualMultipartParsing="true">
<Context allowCasualMultipartParsing="true" path="/">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>			
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>	
</Context>​

서버 재시작.

잘 안되서 프로젝트 클린 - 톰캣 클린 - 이클립스 재시작 하니까 됐다.

'개발자 > spring' 카테고리의 다른 글

[spring boot] SchedulerLock - 톰캣 스케줄러 중복 동작 방지  (0) 2021.08.26
XSS JSON  (0) 2021.06.16

 

AHC 네츄럴 퍼펙션 더블 쉴드 선스틱


여름 맞이 선스틱 구매!

사실 출퇴근 말고는 밖에 나가지 않기 때문에
선크림 필요없다고 생각했었는데
컴퓨터 조명에 그을려지는 낯빛을 보다가
G마켓 포인트 소멸 문자를 받고
선스틱을 사게 되었어요 ㅋㅋ

 

 

14G 이 작은 사이즈고, 22G으로 좀더 큰 사이즈가 있었어요

1+1으로 사는거라 올해 안에 다 못 쓸거 같아서 좀더 저렴한 14G를 구매!

 

사이즈가 컴팩트하고 귀엽

 

뒷면에 설명이 있고

뚜껑을 열면 안에 이렇게 이중으로 뚜껑이 있네요
저는 불편해서 그냥 빼놓고 쓸 거 같아요

 

약간 하늘빛이 도는 색이고, 별로 아무 냄새도 안 나요 ㅋㅋ

오.. 다 꺼내면 이정도?
양이 생각보다 적다 싶은데 14G은 되겠지 하면서 다시 넣어봅니다

 

슥슥 발라봤는데 발림성은 나쁘지 않은 거 같아요(좋고 나쁨의 기준이 없는 편)
이번 여름 잘 바르게 되면 재구매하는지 후기 남겨볼게요 ㅋㅋ

oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');"

String -> Date포맷

<span th:text="${#temporals.format(result.regDt, 'yyyy-MM-dd HH:mm')}"></span>

Date -> Date포맷

<span th:text="${#dates.format(result.regDt, 'yyyy-MM-dd')}"></span>

텍스트 대치 하다가 to, name 으로 한국어가 들어갔을 때 UTF-8로 인코딩 되지 않아 오류가 발생한 경우입니다. 

{ 
	"to": ["example@example.com", "example@example.com"]
	, "sub": {
		"%name%": ["테스트", "테테"] 
	} 
}

A message was received from this address by our systems that had errors in the SMTPAPI header, and cannot be processed due to the following:

 - invalid JSON

If you require assistance in working with the SendGrid API, please contact us at support@sendgrid.com

 


아래 구문으로 encodeText 처리하여 넘겨주면 정상적으로 메일 발송 성공을 확인할 수 있습니다.

message.addHeader("X-SMTPAPI", MimeUtility.encodeText(smtpJson));


Multipart multipart = new MimeMultipart("alternative");
BodyPart part = new MimeBodyPart();
message.addHeader("X-SMTPAPI", MimeUtility.encodeText(smtpJson));
part.setContent(content, "text/html; charset=utf-8");
multipart.addBodyPart(part);
message.setContent(multipart);

 

 

 

SMTP를 이용해 다량 메일을 보는 경우 발송 메일 html 내 건별 텍스트 대치를 하고 싶었습니다. 

회원별 이름이나 닉네임 등을 변경하여 OOO님 이런 식으로 보내고 싶었어요-

Sendgrid 에서 Customizing your send 라는 걸 지원하더라구요-

 

{
  "to": ["example@example.com", "example@example.com"],
  "sub": {
    "%name%": ["Ben", "Joe"]
  }
}

 

JSON 방식으로 위 값처럼 만들어서 보내주면 됩니다~ 

아래 방식으로 JSONObject에 담아 String으로 변환하여 보내줍니다.

List<Map> rstList = [DB에서 받아온 데이터];
List<String> to = new ArrayList<String>(); // 받는사람 email
List<String> name = new ArrayList<String>(); // 받는사람 닉네임

for (Map map: rstList) {
    if(map.get("e-mail") != null && map.get("name") != null) { // 두 값 모두 필수 이기 때문에 if문 추가
        to.add(map.get("email").toString());
        name.add(map.get("name").toString());
    }
}

JSONObject json = new JSONObject();
JSONObject jsonSub = new JSONObject();
json.put("to", to);
jsonSub.put("%name%", name);
json.put("sub", jsonSub);

String jsonRst = json.toString();

 

헤더에 전달하는 방법 : message.addHeader("X-SMTPAPI", jsonRst);

Multipart multipart = new MimeMultipart("alternative");
BodyPart part = new MimeBodyPart();
message.addHeader("X-SMTPAPI", jsonRst);
part.setContent(content, "text/html; charset=utf-8");
multipart.addBodyPart(part);
message.setContent(multipart);

 

 

SMTP 를 이용한 발송은 아래 페이지를 참고해서 작성했습니다.

https://docs.microsoft.com/ko-kr/azure/store-sendgrid-java-how-to-send-email#how-to-use-the-javaxmail-libraries

 

SendGrid 메일 서비스를 사용하는 방법(Java)

Azure에서 SendGrid 메일 서비스를 사용하여 메일을 보내는 방법을 알아봅니다. 코드 샘플은 Java로 작성되었습니다.

docs.microsoft.com

 

 

 

 

 

https://sendgrid.com/docs/for-developers/sending-email/building-an-x-smtpapi-header/#customizing-your-send-filters

 

Building an X-SMTPAPI Header

Learn how to build email content, add recipients and schedule your send.

sendgrid.com

 

 

인텔리제이에서 Sendgrid 메일 발송 테스트 진행 중 한글 깨짐 관련 오류가 발생하여

발송인 메일로 다음과 같은 오류 메일이 왔습니다. 


A message was received from this address by our systems that had errors in the SMTPAPI header, and cannot be processed due to the following:

 - unknown charset 'ms949'

If you require assistance in working with the SendGrid API, please contact us at support@sendgrid.com

 

확인해보니 인텔리제이에서 컴파일이 UTF-8로 되지 않아서 발생하는 현상이었습니다.

help - Edit Custom VM Options.. 를 열어서

 

아래 문구를 추가하고 인텔리제이 재시작~

-Dfile.encoding=UTF-8

 

안 되면 .. 다시 Setting-Editor-File Encodings에서 UTF-8로 설정..

 

그래도 안 되면.. 상단 설정에 Edit Configurations.. 들어가서

 

저는 이걸 다 하고.. 해결되었습니다ㅎㅎ



다음 사이트를 참고하여 셋팅함

https://docs.microsoft.com/ko-kr/azure/store-sendgrid-java-how-to-send-email

 

SendGrid 메일 서비스를 사용하는 방법(Java)

Azure에서 SendGrid 메일 서비스를 사용하여 메일을 보내는 방법을 알아봅니다. 코드 샘플은 Java로 작성되었습니다.

docs.microsoft.com

 

처음엔 다음과 같이 다른 SMTP 제공 사이트과 동일하게 UserId, PWD를 이용해 시도해보았으나, 오류가 발생했습니다.

private static final String SMTP_AUTH_USER = "[Sandgrid 로그인 아이디]";
private static final String SMTP_AUTH_PWD = "[Sandgrid 로그인 비밀번호]";

<오류내용>

535 Authentication failed: Basic authentication is not allowed with 2FA enabled. 
To fix, see 

https://sendgrid.com/docs/for-developers/sending-email/authentication/#basic-authentication

 해결방법

private static final String SMTP_AUTH_USER = "apikey"; // 
private static final String SMTP_AUTH_PWD = "[SG. 로 시작하는 API_KEY]"

로 변경해주니 정상동작했습니다.

 

private static final String SMTP_HOST_NAME = "smtp.sendgrid.net"; // 그냥 텍스트
private static final String SMTP_AUTH_USER = "apikey"; // 그냥 텍스트  
// sandgrid 사이트에서 발급받은 API_KEY (https://app.sendgrid.com/settings/api_keys)
private static final String SMTP_AUTH_PWD = "[API_KEY]"; 

private static class SMTPAuthenticator extends javax.mail.Authenticator {
  public PasswordAuthentication getPasswordAuthentication() {
    String username = SMTP_AUTH_USER;
    String password = SMTP_AUTH_PWD;
    return new PasswordAuthentication(username, password);
  }
}
    
public static boolean SendMail() throws Exception {
		String fromMail = "[보내는사람Email(Sandgrid 에서 등록한, 검증된 이메일 정보 사용)]";
		String fromName = "[보내는사람이름]";
		String toMail = "[받는사람Email]";
		String title = "제목";
		String content = "<p>안녕,</p> <p><b>테스트</b>중이다</p><p>고마워,<br>존</br></p>";
		
		// SMTP 정보 셋팅
		Properties properties = new Properties();
		properties.put("mail.transport.protocol", "smtp");
		properties.put("mail.smtp.host", SMTP_HOST_NAME);
		properties.put("mail.smtp.port", 587);
		properties.put("mail.smtp.auth", "true");

		Authenticator auth = new SMTPAuthenticator();
		Session mailSession = Session.getDefaultInstance(properties, auth);
		try {
			MimeMessage message = new MimeMessage(mailSession);
			
			// 보낸사람 (Sandgrid 에서 등록한, 검증된 이메일 정보 사용)
            InternetAddress from = new InternetAddress(fromMail, fromName, "UTF-8");
            message.setFrom(from);
            // 받는사람
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(toMail));
            // 제목
			message.setSubject(title);
			message.setSentDate(new java.util.Date());

			Multipart multipart = new MimeMultipart("alternative");
            // 내용(본문)
			BodyPart part = new MimeBodyPart();
			part.setContent(content, "text/html; charset=utf-8"); // 한글 깨지지 않도록 utf-8 추가
			multipart.addBodyPart(part);
			message.setContent(multipart);
			// 발송
            Transport transport = mailSession.getTransport();
			transport.connect();
			transport.sendMessage(message, message.getAllRecipients());
			transport.close();
			return true;
		} catch (MessagingException ex){
			System.out.println("메일 발송 에러 : " + ex);
		}
		return false;
	}

 

 

https://sendgrid.com/docs/for-developers/sending-email/authentication/#basic-authentication

 

Authentication

Authenticating with the SendGrid API.

sendgrid.com

 

Sendgrid 메일을 JAVA에서 적용하는 경우,

401 오류 : The provided authorization grant is invalid, expired, or revoked 오류는,

{"errors":[{"message":"The provided authorization grant is invalid, expired, or revoked"
,"field":null,"help":null}]}
{Strict-Transport-Security=max-age=600; includeSubDomains
, Server=nginx, Access-Control-Allow-Origin=https://sendgrid.api-docs.io,
Access-Control-Allow-Methods=POST, Connection=keep-alive
, X-No-CORS-Reason=https://sendgrid.com/docs/Classroom/Basics/API/cors.html, 
Content-Length=116, Access-Control-Max-Age=600, Date=Mon, 17 May 2021 07:42:51 GMT
, Access-Control-Allow-Headers=Authorization, 
Content-Type, On-behalf-of, x-sg-elas-acl, Content-Type=application/json}

SendGrid sg = new SendGrid(System.getenv("[API_KEY]"));

로 제공된 부분에 System.getenv("[API_KEY]") 에서 null을 반환하여 오류가 발생합니다. 

System.getenv("") 구문을 제거 후 정상동작을 확인할 수 있습니다.

        Email from = new Email("[sendgrid에서 등록한, 검증된 보내는 사람 메일]");
		Email to = new Email("[받는사람메일]");
		String subject = "Sending with Twilio SendGrid is Fun";
		Content content = new Content("text/plain", "and easy to do anywhere, even with Java");

		Mail mail = new Mail(from, subject, to, content);
		SendGrid sg = new SendGrid("[API_KEY]");
		Request request = new Request();
		try {
			request.setMethod(Method.POST);
			request.setEndpoint("mail/send");
			request.setBody(mail.build());
			Response response = sg.api(request);
			System.out.println(response.getStatusCode());
			System.out.println(response.getBody());
			System.out.println(response.getHeaders());
		} catch (IOException ex) {
			throw ex;
		}

 

 


 

403 오류의 경우, "[sendgrid에서 등록한, 검증된 보내는 사람 메일]" 이 일치하지 않아서 발생하는 오류입니다. 

{"errors":[{"message":"The from address does not match a verified Sender Identity. 
Mail cannot be sent until this error is resolved. 
Visit https://sendgrid.com/docs/for-developers/sending-email/sender-identity/ to see the Sender Identity requirements","field":"from","help":null}]}

관리 사이트 내에서 'https://app.sendgrid.com/settings/sender_auth' 로 접근하여 이메일을 등록해주고, 해당 메일로 전송된 인증 메일을 통해 검증을 완료한 후 from 메일에 작성하여 발송테스트를 진행하면 됩니다.

아래 이미지와 같이 검증된! 마크가 있어야 완료 상태입니다.

 

API KEY 발급은 https://app.sendgrid.com/settings/api_keys 페이지로 접근하여

 

우측 API 키 생성 클릭

키 이름을 설정해주고, 전체 엑세스 [Full Access] 를 선택 

Create & View 클릭 시 바로 API키가 생성되며 다시 확인할 수 없으므로 잘 저장해두셔야 합니다. 

이 API_KEY를 이용해 메일을 발송합니다.

 

classnotfoundException이 떴다.

기존에 3.1을 부르고 있었는데 4.5.8로 변경하니까 오류가 해결됨

version 의 문제인 듯 

 

    // https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient
    compile  'org.apache.httpcomponents:httpclient:4.5.8'

 

 

SpringBoot 에서 java.io.FileNotFoundException: class path resource [com/google/common/base/Supplier.class] cannot be opened because it does not exist 오류 발생

pom.xml에 guava 를 추가해준다.

<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>21.0</version>
</dependency>
<!-- Thanks for using https://jar-download.com -->

 

오류 내용

20210419 13:25:25.046 [restartedMain] ERROR o.s.b.SpringApplication - Application startup failed 
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration]; nested exception is java.io.FileNotFoundException: class path resource [com/google/common/base/Supplier.class] cannot be opened because it does not exist
	at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:616)
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:299)
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
	at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:606)
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:299)
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:190)
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:292)
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:198)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:167)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:308)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:228)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:272)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:92)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:687)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:525)
	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
	at ...Application.main(Application.java:14)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.io.FileNotFoundException: class path resource [com/google/common/base/Supplier.class] cannot be opened because it does not exist
	at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
	at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:50)
	at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:98)
	at org.springframework.boot.type.classreading.ConcurrentReferenceCachingMetadataReaderFactory.createMetadataReader(ConcurrentReferenceCachingMetadataReaderFactory.java:89)
	at org.springframework.boot.type.classreading.ConcurrentReferenceCachingMetadataReaderFactory.getMetadataReader(ConcurrentReferenceCachingMetadataReaderFactory.java:76)
	at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:93)
	at org.springframework.context.annotation.ConfigurationClassParser.asSourceClass(ConfigurationClassParser.java:693)
	at org.springframework.context.annotation.ConfigurationClassParser$SourceClass.getInterfaces(ConfigurationClassParser.java:870)
	at org.springframework.context.annotation.ConfigurationClassParser.processInterfaces(ConfigurationClassParser.java:363)
	at org.springframework.context.annotation.ConfigurationClassParser.processInterfaces(ConfigurationClassParser.java:371)
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:320)
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:190)
	at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:292)
	at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:245)
	at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:606)
	... 28 common frames omitted

Process finished with exit code 0

 

 

 

+ Recent posts