SlideShare una empresa de Scribd logo
1 de 139
Descargar para leer sin conexión
‹#›© 2016 Pivotal Software, Inc. All rights reserved. ‹#›© 2016 Pivotal Software, Inc. All rights reserved.
Spring Boot Tips
Toshiaki Maki (@making)
tmaki@pivotal.io
Spring 2017 Feb
2017-02-27
© 2016 Pivotal Software, Inc. All rights reserved.
Who am I ?
• Toshiaki Maki (@making) https://ik.am
• Sr. Solutions Architect @Pivotal
• Spring ☘ / Cloud Foundry ☁ / Concourse ✈ / BOSH 🐚
bit.ly/hajiboot2
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Boot is ....
• Opinionated Framework on Spring Ecosystem
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Boot is ....
• Opinionated Framework on Spring Ecosystem
Spring Boot Way
© 2016 Pivotal Software, Inc. All rights reserved.
https://goo.gl/Ey1y3X
https://github.com/openenquete/enquete
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.jar
Thymeleaf
SpringData
JPA
Spring Data REST
Spring MVC
MySQL
SpringSecurity
OAuth
Cloud Foundry
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.jar
Thymeleaf
SpringData
JPA
Spring Data REST
Spring MVC
MySQL
SpringSecurity
OAuth
Cloud Foundry
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.jar
Thymeleaf
SpringData
JPA
Spring Data REST
Spring MVC
MySQL
SpringSecurity
OAuth
Cloud Foundry
AJAX / REST
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.jar
Thymeleaf
SpringData
JPA
Spring Data REST
Spring MVC
MySQL
SpringSecurity
OAuth
Cloud Foundry
AJAX / REST
GitHub
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.jar
Thymeleaf
SpringData
JPA
Spring Data REST
Spring MVC
MySQL
SpringSecurity
OAuth
Cloud Foundry
AJAX / REST
GitHub
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
© 2016 Pivotal Software, Inc. All rights reserved.
Error
© 2016 Pivotal Software, Inc. All rights reserved.
Error
© 2016 Pivotal Software, Inc. All rights reserved.
Error
© 2016 Pivotal Software, Inc. All rights reserved.
Error
org.springframework.boot.autoconfigure.web.DefaultErrorViewResolver
src/main/resources
/static/error/403.html
404.html
40x.html
500.html
50x.html
© 2016 Pivotal Software, Inc. All rights reserved.
Error
org.springframework.boot.autoconfigure.web.DefaultErrorViewResolver
src/main/resources
/templates/error/403.<ext>
404.<ext>
40x.<ext>
500.<ext>
50x.<ext>
© 2016 Pivotal Software, Inc. All rights reserved.
<table th:if="${@environment.acceptsProfiles('default')}">

<tr>
<th>Status</th><td th:text="${status}"></td>
</tr>

<tr>
<th>Error</th><td th:text="${error}"></td>
</tr>

<tr>
<th>Exception</th><td th:text="${exception}"></td>
</tr>

<tr>
<th>Message</th><td th:text="${message}"></td>
</tr>

</table>
© 2016 Pivotal Software, Inc. All rights reserved.
<table th:if="${@environment.acceptsProfiles('default')}">

<tr>
<th>Status</th><td th:text="${status}"></td>
</tr>

<tr>
<th>Error</th><td th:text="${error}"></td>
</tr>

<tr>
<th>Exception</th><td th:text="${exception}"></td>
</tr>

<tr>
<th>Message</th><td th:text="${message}"></td>
</tr>

</table>
profile default
disabled
© 2016 Pivotal Software, Inc. All rights reserved.
<table th:if="${@environment.acceptsProfiles('default')}">

<tr>
<th>Status</th><td th:text="${status}"></td>
</tr>

<tr>
<th>Error</th><td th:text="${error}"></td>
</tr>

<tr>
<th>Exception</th><td th:text="${exception}"></td>
</tr>

<tr>
<th>Message</th><td th:text="${message}"></td>
</tr>

</table>
profile default
disabled
© 2016 Pivotal Software, Inc. All rights reserved.
<table th:if="...">

<!-- -->
<tr th:if="${trace}">
<th>Trace</th>
<td><pre th:text="${trace}"></pre></td>
</tr>

© 2016 Pivotal Software, Inc. All rights reserved.
<table th:if="...">

<!-- -->
<tr th:if="${trace}">
<th>Trace</th>
<td><pre th:text="${trace}"></pre></td>
</tr>

server.error.include-stacktrace=always
application-default.properties
© 2016 Pivotal Software, Inc. All rights reserved.
<table th:if="...">

<!-- -->
<tr th:if="${trace}">
<th>Trace</th>
<td><pre th:text="${trace}"></pre></td>
</tr>

server.error.include-stacktrace=always
application-default.properties
© 2016 Pivotal Software, Inc. All rights reserved.
@ControllerAdvice(annotations = Controller.class)

public class ErrorControllerAdvice {

@ExceptionHandler(NoSuchElementException.class)

@ResponseStatus(HttpStatus.NOT_FOUND)

public String noSuchEelemtException() {

return "error/404";

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
@ControllerAdvice(annotations = Controller.class)

public class ErrorControllerAdvice {

@ExceptionHandler(NoSuchElementException.class)

@ResponseStatus(HttpStatus.NOT_FOUND)

public String noSuchEelemtException() {

return "error/404";

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
@Autowired Environment env;


@ExceptionHandler(NoSuchElementException.class)

@ResponseStatus(HttpStatus.NOT_FOUND)

public String ex(NoSuchElementException e,
Model model) {
addErrors(e, HttpStatus.NOT_FOUND, model);

return "error/404";

}
© 2016 Pivotal Software, Inc. All rights reserved.
void addErrors(Exception e, HttpStatus status,
Model model) {
if (env.acceptsProfiles("default")) {

StringWriter stackTrace = new StringWriter();

e.printStackTrace(new PrintWriter(stackTrace));

stackTrace.flush();

model.addAttribute("status", status.value());

model.addAttribute("error", status.getReasonPhrase());

model.addAttribute("exception", e.getClass());

model.addAttribute("message", e.getMessage());

model.addAttribute("trace", stackTrace.toString());

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
void addErrors(Exception e, HttpStatus status,
Model model) {
if (env.acceptsProfiles("default")) {

StringWriter stackTrace = new StringWriter();

e.printStackTrace(new PrintWriter(stackTrace));

stackTrace.flush();

model.addAttribute("status", status.value());

model.addAttribute("error", status.getReasonPhrase());

model.addAttribute("exception", e.getClass());

model.addAttribute("message", e.getMessage());

model.addAttribute("trace", stackTrace.toString());

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
Profile
• java -jar app.jar --spring.profiles.active=prod
• java -jar -Dspring.profiles.active=prod app.jar
• export SPRING_PRPFILES_ACTIVE=prod
Cloud Foundry
cloud
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Data REST REST API
<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-data-rest</artifactId>

</dependency>
© 2016 Pivotal Software, Inc. All rights reserved.
public interface FooRepository
extends CrudRepository<Foo, Long> {


}
Repository --> REST API
© 2016 Pivotal Software, Inc. All rights reserved.
public interface FooRepository
extends CrudRepository<Foo, Long> {


}
Repository --> REST API
GET /foos
POST /foos
GET /foos/{fooId}
PUT /foos/{fooId}
DELETE /foos/{fooId}
PATCH /foos/{fooId}
...
© 2016 Pivotal Software, Inc. All rights reserved.
Repository --> REST API
public interface FooRepository
extends PagingAndSortingRepository<Foo, Long> {


}
© 2016 Pivotal Software, Inc. All rights reserved.
Repository --> REST API
public interface FooRepository
extends PagingAndSortingRepository<Foo, Long> {


}
GET /foos?page={page}
&size={size}&sort={sort}
...
© 2016 Pivotal Software, Inc. All rights reserved.
Repository --> REST API
public interface FooRepository
extends PagingAndSortingRepository<Foo, Long> {
List<Foo> findByName(String name);

}
© 2016 Pivotal Software, Inc. All rights reserved.
Repository --> REST API
public interface FooRepository
extends PagingAndSortingRepository<Foo, Long> {
List<Foo> findByName(String name);

}
GET /foos/search/findByName?name={name}
...
© 2016 Pivotal Software, Inc. All rights reserved.
Repository --> REST API
public interface FooRepository
extends Repository<Foo, Long> {
@RestResource(exported = false)
List<Foo> findBySeminarId(Long seminarId);
Optional<Foo> findOne(Long id);
void save(Foo foo); 

}
© 2016 Pivotal Software, Inc. All rights reserved.
Repository --> REST API
public interface FooRepository
extends Repository<Foo, Long> {
@RestResource(exported = false)
List<Foo> findBySeminarId(Long seminarId);
Optional<Foo> findOne(Long id);
void save(Foo foo); 

} GET /foos/{id}
POST /foos
© 2016 Pivotal Software, Inc. All rights reserved.
RepositoryEventHandler
Traditional
Spring Data REST
Controller Service Repository
Repository EventHandler
© 2016 Pivotal Software, Inc. All rights reserved.
RepositoryEventHandler
@RepositoryEventHandler @Component
public class UsernameEventHandler {
@HandleReforeCreate
void setUsername(UsernameHolder holder) {
String username = SecurityContextHolder
.getContext().getAuthentication()
.getName();
holder.setUsername(username);
}

}
© 2016 Pivotal Software, Inc. All rights reserved.
RepositoryEventHandler
@RepositoryEventHandler @Component
public class UsernameEventHandler {
@HandleReforeCreate
void setUsername(UsernameHolder holder) {
String username = SecurityContextHolder
.getContext().getAuthentication()
.getName();
holder.setUsername(username);
}

}
UserHolder
username
© 2016 Pivotal Software, Inc. All rights reserved.
Bean Validation
@Configuration public class RestConfig
extends RepositoryRestConfigurerAdapter {
private final Validator vldtr;
/* constructor */
@Override
public void configureValidatingRepositoryEventListener(...) {
lstnr.addValidator("beforeCreate", vldtr);
lstnr.addValidator("beforeSave", vldtr);
}
}
© 2016 Pivotal Software, Inc. All rights reserved.
Bean Validation
@Configuration public class RestConfig
extends RepositoryRestConfigurerAdapter {
private final Validator vldtr;
/* constructor */
@Override
public void configureValidatingRepositoryEventListener(...) {
lstnr.addValidator("beforeCreate", vldtr);
lstnr.addValidator("beforeSave", vldtr);
}
}
{
"errors": [{
"entity": "ResponseForSession",
"property": "difficulty",
"invalidValue": null,
"message": "may not be null"
}, {
"entity": "ResponseForSession",
"property": "satisfaction",
"invalidValue": null,
"message": "may not be null"
}
]
}
© 2016 Pivotal Software, Inc. All rights reserved.
Traditional
Spring Data REST
Controller Service Repository
Repository EventHandler
@Transactional
© 2016 Pivotal Software, Inc. All rights reserved.
Traditional
Spring Data REST
Controller Service Repository
Repository EventHandler
@Transactional
RepositoryEntity
Controller
© 2016 Pivotal Software, Inc. All rights reserved.
Traditional
Spring Data REST
Controller Service Repository
Repository EventHandler
@Transactional
RepositoryEntity
Controller
© 2016 Pivotal Software, Inc. All rights reserved.
Traditional
Spring Data REST
Controller Service Repository
Repository EventHandler
@Transactional
RepositoryEntity
Controller
AOP
© 2016 Pivotal Software, Inc. All rights reserved.
• https://blog.ik.am/entries/403
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
CSRF
• Spring Security CSRF
• Ajax / SPA
© 2016 Pivotal Software, Inc. All rights reserved.
CSRF
• Spring Security CSRF
• Ajax / SPA
public class SecurityConfig
extends WebSecurityConfigurerAdapter {

@Override

protected void configure(HttpSecurity http)
throws Exception {

http.csrf().disable()/* ... */;
}
}
© 2016 Pivotal Software, Inc. All rights reserved.
CSRF
• Spring Security CSRF
• Ajax / SPA
public class SecurityConfig
extends WebSecurityConfigurerAdapter {

@Override

protected void configure(HttpSecurity http)
throws Exception {

http.csrf().disable()/* ... */;
}
}
🙅
© 2016 Pivotal Software, Inc. All rights reserved.
$.post('/user', {
firstName: 'Fred',
lastName: 'Flintstone',
_csrf: $('input[name=_csrf]').val()
});
$(document).ajaxSend(function(e, xhr, options) {
var token = $('input[name=_csrf]').val();
xhr.setRequestHeader('X-CSRF-TOKEN', token);
});
OR
© 2016 Pivotal Software, Inc. All rights reserved.
I don't like jQuery 😟
© 2016 Pivotal Software, Inc. All rights reserved.
public class SecurityConfig
extends WebSecurityConfigurerAdapter {
@Override

protected void configure(HttpSecurity http)
throws Exception {

http./* ... * /and().csrf()

.csrfTokenRepository(
CookieCsrfTokenRepository
.withHttpOnlyFalse());

}

}
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP (_csrf) HTTP
(X-CSRF-TOKEN) CSRF HTTP
( )
© 2016 Pivotal Software, Inc. All rights reserved.
HTTP (_csrf) HTTP
(X-CSRF-TOKEN) CSRF HTTP
( )
HTTP (_csrf) HTTP
(X-XSRF-TOKEN) CSRF
Cookie(name=XSRF-TOKEN, httpOnly)
© 2016 Pivotal Software, Inc. All rights reserved.
Axios
• https://github.com/mzabriskie/axios
• node.js Promise HTTP
• XSRF-TOKEN Cookie HTTP
X-XSRF-TOKEN (AngularJS )
© 2016 Pivotal Software, Inc. All rights reserved.
Axios
• https://github.com/mzabriskie/axios
• node.js Promise HTTP
• XSRF-TOKEN Cookie HTTP
X-XSRF-TOKEN (AngularJS )
axios.post('/response_for_seminar', {
comment: 'Great!',
request: 'Sushi!'
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
OAuth2 SSO with GitHub
<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-oauth2</artifactId>

</dependency>
© 2016 Pivotal Software, Inc. All rights reserved.
Authorization Code
(grant_type=authorization_code)
Authorization
Server (GitHub)
Web UI
Resource
Server (GitHub API)
© 2016 Pivotal Software, Inc. All rights reserved.
Authorization Code
(grant_type=authorization_code)
Authorization
Server (GitHub)
Web UI
Resource
Server (GitHub API)
authorize
© 2016 Pivotal Software, Inc. All rights reserved.
Authorization Code
(grant_type=authorization_code)
Authorization
Server (GitHub)
Web UI
Resource
Server (GitHub API)
authorize
redirect
© 2016 Pivotal Software, Inc. All rights reserved.
Authorization Code
(grant_type=authorization_code)
Authorization
Server (GitHub)
Web UI
Resource
Server (GitHub API)
authorize
redirect
code
© 2016 Pivotal Software, Inc. All rights reserved.
Authorization Code
(grant_type=authorization_code)
Authorization
Server (GitHub)
Web UI
Resource
Server (GitHub API)
authorize
redirect
code
code
© 2016 Pivotal Software, Inc. All rights reserved.
Authorization Code
(grant_type=authorization_code)
Authorization
Server (GitHub)
Web UI
Resource
Server (GitHub API)
authorize
redirect
code
code
token
© 2016 Pivotal Software, Inc. All rights reserved.
Authorization Code
(grant_type=authorization_code)
Authorization
Server (GitHub)
Web UI
Resource
Server (GitHub API)
authorize
redirect
code
code
token
token
© 2016 Pivotal Software, Inc. All rights reserved.
Authorization Code
(grant_type=authorization_code)
Authorization
Server (GitHub)
Web UI
Resource
Server (GitHub API)
authorize
redirect
code
code
token
token
response
© 2016 Pivotal Software, Inc. All rights reserved.
@EnableOAuth2Sso
@SpringBootApplication
@EnableOAuth2Sso

public class EnqueteApplication {

public static void main(String[] args) {

SpringApplication.run(EnqueteApplication.class,
args);

}
}
© 2016 Pivotal Software, Inc. All rights reserved.
security.oauth2.client.client-id=xxxxx
security.oauth2.client.client-secret=xxxxx
security.oauth2.client.access-token-
uri=https://github.com/login/oauth/access_token
security.oauth2.client.user-authorization-
uri=https://github.com/login/oauth/authorize

security.oauth2.resource.user-info-uri=https://
api.github.com/user
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
PrincipalExtractor / AuthoritiesExtractor
public interface PrincipalExtractor {

Object extractPrincipal(Map<String, Object> map);
}
public interface AuthoritiesExtractor {

List<GrantedAuthority>
extractAuthorities(Map<String, Object> map);
}
© 2016 Pivotal Software, Inc. All rights reserved.
public EnqUserPrincipalExtractor
implements AuthoritiesExtractor {
@Override

Object extractPrincipal(Map<String, Object> map){
return new EnqUser(map.get("name"),
map.get("email"),
map.get("avatar_url"));
}
}
© 2016 Pivotal Software, Inc. All rights reserved.
public EnqUserPrincipalExtractor
implements AuthoritiesExtractor {
@Override

Object extractPrincipal(Map<String, Object> map){
return new EnqUser(map.get("name"),
map.get("email"),
map.get("avatar_url"));
}
}
security.oauth2.resource.user-info-uri
© 2016 Pivotal Software, Inc. All rights reserved.
public EnqUserAuthoritiesExtractor
implements PrincipalExtractor {
@Override

List<GrantedAuthority>
extractAuthorities(Map<String, Object> map){
return Arrays.asList(
!"making".equals(map.get("login")) ?
new SimpleGrantAuthority("ROLE_USER") :
new SimpleGrantAuthority("ROLE_ADMIN")
)
}
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
authorize
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
authorize
redirect
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
authorize
redirect
code
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
authorize
redirect
code
code
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
authorize
redirect
code
code
token
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
authorize
redirect
code
code
token
token
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
authorize
redirect
code
code
token
token
response
© 2016 Pivotal Software, Inc. All rights reserved.
GitHub OK
Authorization
Server
Web UI
Resource
Server
authorize
redirect
code
code
token
token
response
@EnableAuthorizationServer
@EnableResourceServer
© 2016 Pivotal Software, Inc. All rights reserved.
UI SSO
Authorization
Server
Web UI
Resource
ServerAnother Web UI
© 2016 Pivotal Software, Inc. All rights reserved.
• https://github.com/Pivotal-Japan/spring-security-oauth-
workshop
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
public interface UrlShortenerClient {

String shorten(String longUrl);
}
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
@ConditionalOnProperty
© 2016 Pivotal Software, Inc. All rights reserved.
@Component
@ConditionalOnProperty(name =
"enquete.bitly.access-token")
public BitlyClient
implements UrlShortenerClient {
@Override

String shorten(String longUrl) {
String token = props.getBitly()
.getAccessToken();
/* ... */
}
}
Bit.ly URL
© 2016 Pivotal Software, Inc. All rights reserved.
@Component
@ConditionalOnProperty(name =
"enquete.googl.api-key")
public GooglClient
implements UrlShortenerClient {
@Override

String shorten(String longUrl) {
String apiKey = props.getGoogl().getApiKey();
/* ... */
}
}
Goo.gl URL
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.bitly.access-token=0123456789
enquete.googl.api-key=abcdef
BitlyClient
GooglClient
© 2016 Pivotal Software, Inc. All rights reserved.
@Controller
public SeminarController {
final Optional<UrlShortenerClient> shortener;

@GetMapping("seminars/{seminarId}")

public String list(...) {
shortener.ifPresent(x -> {
String shorten = x.shorten(url);
model.addAttribute("shorten", shorten);
});
/* ... */
}
}
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.bitly.access-token=0123456789
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.bitly.access-token=0123456789
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.bitly.access-token=0123456789enquete.googl.api-key=abcdef
© 2016 Pivotal Software, Inc. All rights reserved.
enquete.bitly.access-token=0123456789enquete.googl.api-key=abcdef
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
@ConfigurationProperties
@ConfigurationProperties(prefix = "enquete")
@Component @Validated
public class EnqProps {

private Set<String> adminUsers;
private Bitly bitly;
public static class Bitly {

private String accessToken;

}
// setter/getter
}
© 2016 Pivotal Software, Inc. All rights reserved.
Configuration Processor
<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</scope>

</dependency>
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Boot Actuator >= 1.5
• (ROLE_ACTUATOR)
• /info, /health (status )
management.security.enabled=false
application-default.properties
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Boot Actuator >= 1.5
• (ROLE_ACTUATOR)
• /info, /health (status )
management.security.enabled=false
application-default.properties
profile default
disabled
© 2016 Pivotal Software, Inc. All rights reserved.
ROLE_ACTUATOR
public EnqUserAuthoritiesExtractor /* ... */ {
@Override

List<GrantedAuthority>
extractAuthorities(Map<String, Object> map){
return !"making".equals(map.get("login")) ?
asList(new SimpleGrantAuthority("ROLE_USER")) :
asList(new SimpleGrantAuthority("ROLE_ADMIN"),
new SimpleGrantAuthority("ROLE_ACTUATOR"))
}
}
© 2016 Pivotal Software, Inc. All rights reserved.
BeansViz
<dependency>

<groupId>am.ik.beansviz</groupId>

<artifactId>beansviz-spring-boot-actuator</artifactId>

<version>0.1.0</version>
</dependency>
© 2016 Pivotal Software, Inc. All rights reserved.
BeansViz
<dependency>

<groupId>am.ik.beansviz</groupId>

<artifactId>beansviz-spring-boot-actuator</artifactId>

<version>0.1.0</version>
</dependency>
Actuator /beansviz
/beans Graphviz
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
© 2016 Pivotal Software, Inc. All rights reserved.
• https://blog.ik.am/entries/401
© 2016 Pivotal Software, Inc. All rights reserved.
Error
Spring Data REST
CSRF
@EnableOAuth2Sso
@ConditionalOnProperty
Configuration Properties
Spring Boot Actuator
Cloud Foundry Integration
© 2016 Pivotal Software, Inc. All rights reserved.
Check Source code!
https://github.com/openenquete/enquete
© 2016 Pivotal Software, Inc. All rights reserved.
Spring Cloud Services in PWS
• https://content.pivotal.io/blog/building-spring-microservices-
with-cloud-foundrys-new-container-networking-stack
© 2016 Pivotal Software, Inc. All rights reserved.
Check Tutorials!!
•https://github.com/Pivotal-Japan
•https://pivotal-japan.connpass.com/

Más contenido relacionado

La actualidad más candente

Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersSeiya Mizuno
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル貴志 上坂
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方増田 亨
 
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...Insight Technology, Inc.
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)Yoshitaka Kawashima
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...NTT DATA Technology & Innovation
 
Akkaで分散システム入門
Akkaで分散システム入門Akkaで分散システム入門
Akkaで分散システム入門Shingo Omura
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話Koichiro Matsuoka
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春VerMasahito Zembutsu
 
もしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点などもしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点などKentaro Kitagawa
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方Yoshiyasu SAEKI
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo!デベロッパーネットワーク
 

La actualidad más candente (20)

Apache Avro vs Protocol Buffers
Apache Avro vs Protocol BuffersApache Avro vs Protocol Buffers
Apache Avro vs Protocol Buffers
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル
 
NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例
 
君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
[C33] 24時間365日「本当に」止まらないデータベースシステムの導入 ~AlwaysOn+Qシステムで完全無停止運用~ by Nobuyuki Sa...
 
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
DevOps with Database on AWS
DevOps with Database on AWSDevOps with Database on AWS
DevOps with Database on AWS
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
 
実践 NestJS
実践 NestJS実践 NestJS
実践 NestJS
 
Akkaで分散システム入門
Akkaで分散システム入門Akkaで分散システム入門
Akkaで分散システム入門
 
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話DDD x CQRS   更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
 
もしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点などもしOracleDBAがMySQLを管理することになったときの注意点など
もしOracleDBAがMySQLを管理することになったときの注意点など
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
 

Similar a 実例で学ぶ、明日から使えるSpring Boot Tips #jsug

Team Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyoTeam Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyoToshiaki Maki
 
Spring Cloud Servicesの紹介 #pcf_tokyo
Spring Cloud Servicesの紹介 #pcf_tokyoSpring Cloud Servicesの紹介 #pcf_tokyo
Spring Cloud Servicesの紹介 #pcf_tokyoToshiaki Maki
 
今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_kToshiaki Maki
 
Use Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile AppsUse Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile AppsNathan Smith
 
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyoSpring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyoToshiaki Maki
 
Fluentd and Embulk Game Server 4
Fluentd and Embulk Game Server 4Fluentd and Embulk Game Server 4
Fluentd and Embulk Game Server 4N Masahiro
 
From Zero to Hero with REST and OAuth2 #jjug
From Zero to Hero with REST and OAuth2 #jjugFrom Zero to Hero with REST and OAuth2 #jjug
From Zero to Hero with REST and OAuth2 #jjugToshiaki Maki
 
Spring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjugSpring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjugToshiaki Maki
 
Restful Integration with WSO2 ESB
Restful Integration with WSO2 ESB Restful Integration with WSO2 ESB
Restful Integration with WSO2 ESB WSO2
 
SoundCloud's Toolbox for Microservices
SoundCloud's Toolbox for MicroservicesSoundCloud's Toolbox for Microservices
SoundCloud's Toolbox for MicroservicesBora Tunca
 
Php My Sql Security 2007
Php My Sql Security 2007Php My Sql Security 2007
Php My Sql Security 2007Aung Khant
 
Implementing @font-face
Implementing @font-faceImplementing @font-face
Implementing @font-faceAban Nesta
 
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Toshiaki Maki
 
Single-Source Publishing Across Multiple Formats with George Bina and Radu Co...
Single-Source Publishing Across Multiple Formats with George Bina and Radu Co...Single-Source Publishing Across Multiple Formats with George Bina and Radu Co...
Single-Source Publishing Across Multiple Formats with George Bina and Radu Co...Information Development World
 
Lessons learned from upgrading Thymeleaf
Lessons learned from upgrading ThymeleafLessons learned from upgrading Thymeleaf
Lessons learned from upgrading ThymeleafVMware Tanzu
 
Using Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyUsing Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyLaunchAny
 

Similar a 実例で学ぶ、明日から使えるSpring Boot Tips #jsug (20)

Team Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyoTeam Support in Concourse CI 2.0 #concourse_tokyo
Team Support in Concourse CI 2.0 #concourse_tokyo
 
Spring Cloud Servicesの紹介 #pcf_tokyo
Spring Cloud Servicesの紹介 #pcf_tokyoSpring Cloud Servicesの紹介 #pcf_tokyo
Spring Cloud Servicesの紹介 #pcf_tokyo
 
今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k今すぐ始めるCloud Foundry #hackt #hackt_k
今すぐ始めるCloud Foundry #hackt #hackt_k
 
Use Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile AppsUse Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile Apps
 
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyoSpring Framework 5.0による Reactive Web Application #JavaDayTokyo
Spring Framework 5.0による Reactive Web Application #JavaDayTokyo
 
Fluentd and Embulk Game Server 4
Fluentd and Embulk Game Server 4Fluentd and Embulk Game Server 4
Fluentd and Embulk Game Server 4
 
From Zero to Hero with REST and OAuth2 #jjug
From Zero to Hero with REST and OAuth2 #jjugFrom Zero to Hero with REST and OAuth2 #jjug
From Zero to Hero with REST and OAuth2 #jjug
 
Spring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjugSpring ❤️ Kotlin #jjug
Spring ❤️ Kotlin #jjug
 
Restful Integration with WSO2 ESB
Restful Integration with WSO2 ESB Restful Integration with WSO2 ESB
Restful Integration with WSO2 ESB
 
SoundCloud's Toolbox for Microservices
SoundCloud's Toolbox for MicroservicesSoundCloud's Toolbox for Microservices
SoundCloud's Toolbox for Microservices
 
Php My Sql Security 2007
Php My Sql Security 2007Php My Sql Security 2007
Php My Sql Security 2007
 
Introduction to OData
Introduction to ODataIntroduction to OData
Introduction to OData
 
Implementing @font-face
Implementing @font-faceImplementing @font-face
Implementing @font-face
 
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
Event Driven Microservices with Spring Cloud Stream #jjug_ccc #ccc_ab3
 
Single-Source Publishing Across Multiple Formats with George Bina and Radu Co...
Single-Source Publishing Across Multiple Formats with George Bina and Radu Co...Single-Source Publishing Across Multiple Formats with George Bina and Radu Co...
Single-Source Publishing Across Multiple Formats with George Bina and Radu Co...
 
Lessons learned from upgrading Thymeleaf
Lessons learned from upgrading ThymeleafLessons learned from upgrading Thymeleaf
Lessons learned from upgrading Thymeleaf
 
Origins of Serverless
Origins of ServerlessOrigins of Serverless
Origins of Serverless
 
Using Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in RubyUsing Sinatra to Build REST APIs in Ruby
Using Sinatra to Build REST APIs in Ruby
 
SlideShare Instant
SlideShare InstantSlideShare Instant
SlideShare Instant
 
SlideShare Instant
SlideShare InstantSlideShare Instant
SlideShare Instant
 

Más de Toshiaki Maki

From Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsugFrom Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsugToshiaki Maki
 
Concourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyoConcourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyoToshiaki Maki
 
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1tServerless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1tToshiaki Maki
 
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1Toshiaki Maki
 
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1Toshiaki Maki
 
Spring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & MicrometerSpring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & MicrometerToshiaki Maki
 
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpOpen Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpToshiaki Maki
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugToshiaki Maki
 
Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Toshiaki Maki
 
BOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoBOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoToshiaki Maki
 
Why PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring BootWhy PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring BootToshiaki Maki
 
Zipkin Components #zipkin_jp
Zipkin Components #zipkin_jpZipkin Components #zipkin_jp
Zipkin Components #zipkin_jpToshiaki Maki
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07Toshiaki Maki
 
Managing your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CIManaging your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CIToshiaki Maki
 
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...Toshiaki Maki
 
Short Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyoShort Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyoToshiaki Maki
 
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techConsumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techToshiaki Maki
 
Implement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyoImplement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyoToshiaki Maki
 
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...Toshiaki Maki
 
Concourse CI Meetup Demo
Concourse CI Meetup DemoConcourse CI Meetup Demo
Concourse CI Meetup DemoToshiaki Maki
 

Más de Toshiaki Maki (20)

From Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsugFrom Spring Boot 2.2 to Spring Boot 2.3 #jsug
From Spring Boot 2.2 to Spring Boot 2.3 #jsug
 
Concourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyoConcourse x Spinnaker #concourse_tokyo
Concourse x Spinnaker #concourse_tokyo
 
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1tServerless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
Serverless with Spring Cloud Function, Knative and riff #SpringOneTour #s1t
 
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
決済システムの内製化への旅 - SpringとPCFで作るクラウドネイティブなシステム開発 #jsug #sf_h1
 
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
Spring Boot Actuator 2.0 & Micrometer #jjug_ccc #ccc_a1
 
Spring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & MicrometerSpring Boot Actuator 2.0 & Micrometer
Spring Boot Actuator 2.0 & Micrometer
 
Open Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjpOpen Service Broker APIとKubernetes Service Catalog #k8sjp
Open Service Broker APIとKubernetes Service Catalog #k8sjp
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsug
 
Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1Introduction to Spring WebFlux #jsug #sf_a1
Introduction to Spring WebFlux #jsug #sf_a1
 
BOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyoBOSH / CF Deployment in modern ways #cf_tokyo
BOSH / CF Deployment in modern ways #cf_tokyo
 
Why PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring BootWhy PCF is the best platform for Spring Boot
Why PCF is the best platform for Spring Boot
 
Zipkin Components #zipkin_jp
Zipkin Components #zipkin_jpZipkin Components #zipkin_jp
Zipkin Components #zipkin_jp
 
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
マイクロサービスに必要な技術要素はすべてSpring Cloudにある #DO07
 
Managing your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CIManaging your Docker image continuously with Concourse CI
Managing your Docker image continuously with Concourse CI
 
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...Data Microservices with Spring Cloud Stream, Task,  and Data Flow #jsug #spri...
Data Microservices with Spring Cloud Stream, Task, and Data Flow #jsug #spri...
 
Short Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyoShort Lived Tasks in Cloud Foundry #cfdtokyo
Short Lived Tasks in Cloud Foundry #cfdtokyo
 
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3techConsumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
Consumer Driven Contractsで REST API/マイクロサービスをテスト #m3tech
 
Implement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyoImplement Service Broker with Spring Boot #cf_tokyo
Implement Service Broker with Spring Boot #cf_tokyo
 
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
#jjug_ccc #ccc_gh5 What's new in Spring Framework 4.3 / Boot 1.4 + Pivotal's ...
 
Concourse CI Meetup Demo
Concourse CI Meetup DemoConcourse CI Meetup Demo
Concourse CI Meetup Demo
 

Último

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 

Último (20)

TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 

実例で学ぶ、明日から使えるSpring Boot Tips #jsug

  • 1. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. ‹#›© 2016 Pivotal Software, Inc. All rights reserved. Spring Boot Tips Toshiaki Maki (@making) tmaki@pivotal.io Spring 2017 Feb 2017-02-27
  • 2. © 2016 Pivotal Software, Inc. All rights reserved. Who am I ? • Toshiaki Maki (@making) https://ik.am • Sr. Solutions Architect @Pivotal • Spring ☘ / Cloud Foundry ☁ / Concourse ✈ / BOSH 🐚 bit.ly/hajiboot2
  • 3. © 2016 Pivotal Software, Inc. All rights reserved. Spring Boot is .... • Opinionated Framework on Spring Ecosystem
  • 4. © 2016 Pivotal Software, Inc. All rights reserved. Spring Boot is .... • Opinionated Framework on Spring Ecosystem Spring Boot Way
  • 5. © 2016 Pivotal Software, Inc. All rights reserved. https://goo.gl/Ey1y3X https://github.com/openenquete/enquete
  • 6. © 2016 Pivotal Software, Inc. All rights reserved. enquete.jar Thymeleaf SpringData JPA Spring Data REST Spring MVC MySQL SpringSecurity OAuth Cloud Foundry
  • 7. © 2016 Pivotal Software, Inc. All rights reserved. enquete.jar Thymeleaf SpringData JPA Spring Data REST Spring MVC MySQL SpringSecurity OAuth Cloud Foundry
  • 8. © 2016 Pivotal Software, Inc. All rights reserved. enquete.jar Thymeleaf SpringData JPA Spring Data REST Spring MVC MySQL SpringSecurity OAuth Cloud Foundry AJAX / REST
  • 9. © 2016 Pivotal Software, Inc. All rights reserved. enquete.jar Thymeleaf SpringData JPA Spring Data REST Spring MVC MySQL SpringSecurity OAuth Cloud Foundry AJAX / REST GitHub
  • 10. © 2016 Pivotal Software, Inc. All rights reserved. enquete.jar Thymeleaf SpringData JPA Spring Data REST Spring MVC MySQL SpringSecurity OAuth Cloud Foundry AJAX / REST GitHub
  • 11. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 12. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 13. © 2016 Pivotal Software, Inc. All rights reserved. Error
  • 14. © 2016 Pivotal Software, Inc. All rights reserved. Error
  • 15. © 2016 Pivotal Software, Inc. All rights reserved. Error
  • 16. © 2016 Pivotal Software, Inc. All rights reserved. Error
  • 17. © 2016 Pivotal Software, Inc. All rights reserved. Error org.springframework.boot.autoconfigure.web.DefaultErrorViewResolver src/main/resources /static/error/403.html 404.html 40x.html 500.html 50x.html
  • 18. © 2016 Pivotal Software, Inc. All rights reserved. Error org.springframework.boot.autoconfigure.web.DefaultErrorViewResolver src/main/resources /templates/error/403.<ext> 404.<ext> 40x.<ext> 500.<ext> 50x.<ext>
  • 19. © 2016 Pivotal Software, Inc. All rights reserved. <table th:if="${@environment.acceptsProfiles('default')}">
 <tr> <th>Status</th><td th:text="${status}"></td> </tr>
 <tr> <th>Error</th><td th:text="${error}"></td> </tr>
 <tr> <th>Exception</th><td th:text="${exception}"></td> </tr>
 <tr> <th>Message</th><td th:text="${message}"></td> </tr>
 </table>
  • 20. © 2016 Pivotal Software, Inc. All rights reserved. <table th:if="${@environment.acceptsProfiles('default')}">
 <tr> <th>Status</th><td th:text="${status}"></td> </tr>
 <tr> <th>Error</th><td th:text="${error}"></td> </tr>
 <tr> <th>Exception</th><td th:text="${exception}"></td> </tr>
 <tr> <th>Message</th><td th:text="${message}"></td> </tr>
 </table> profile default disabled
  • 21. © 2016 Pivotal Software, Inc. All rights reserved. <table th:if="${@environment.acceptsProfiles('default')}">
 <tr> <th>Status</th><td th:text="${status}"></td> </tr>
 <tr> <th>Error</th><td th:text="${error}"></td> </tr>
 <tr> <th>Exception</th><td th:text="${exception}"></td> </tr>
 <tr> <th>Message</th><td th:text="${message}"></td> </tr>
 </table> profile default disabled
  • 22. © 2016 Pivotal Software, Inc. All rights reserved. <table th:if="...">
 <!-- --> <tr th:if="${trace}"> <th>Trace</th> <td><pre th:text="${trace}"></pre></td> </tr>

  • 23. © 2016 Pivotal Software, Inc. All rights reserved. <table th:if="...">
 <!-- --> <tr th:if="${trace}"> <th>Trace</th> <td><pre th:text="${trace}"></pre></td> </tr>
 server.error.include-stacktrace=always application-default.properties
  • 24. © 2016 Pivotal Software, Inc. All rights reserved. <table th:if="...">
 <!-- --> <tr th:if="${trace}"> <th>Trace</th> <td><pre th:text="${trace}"></pre></td> </tr>
 server.error.include-stacktrace=always application-default.properties
  • 25. © 2016 Pivotal Software, Inc. All rights reserved. @ControllerAdvice(annotations = Controller.class)
 public class ErrorControllerAdvice {
 @ExceptionHandler(NoSuchElementException.class)
 @ResponseStatus(HttpStatus.NOT_FOUND)
 public String noSuchEelemtException() {
 return "error/404";
 }
 }
  • 26. © 2016 Pivotal Software, Inc. All rights reserved. @ControllerAdvice(annotations = Controller.class)
 public class ErrorControllerAdvice {
 @ExceptionHandler(NoSuchElementException.class)
 @ResponseStatus(HttpStatus.NOT_FOUND)
 public String noSuchEelemtException() {
 return "error/404";
 }
 }
  • 27. © 2016 Pivotal Software, Inc. All rights reserved. @Autowired Environment env; 
 @ExceptionHandler(NoSuchElementException.class)
 @ResponseStatus(HttpStatus.NOT_FOUND)
 public String ex(NoSuchElementException e, Model model) { addErrors(e, HttpStatus.NOT_FOUND, model);
 return "error/404";
 }
  • 28. © 2016 Pivotal Software, Inc. All rights reserved. void addErrors(Exception e, HttpStatus status, Model model) { if (env.acceptsProfiles("default")) {
 StringWriter stackTrace = new StringWriter();
 e.printStackTrace(new PrintWriter(stackTrace));
 stackTrace.flush();
 model.addAttribute("status", status.value());
 model.addAttribute("error", status.getReasonPhrase());
 model.addAttribute("exception", e.getClass());
 model.addAttribute("message", e.getMessage());
 model.addAttribute("trace", stackTrace.toString());
 }
 }
  • 29. © 2016 Pivotal Software, Inc. All rights reserved. void addErrors(Exception e, HttpStatus status, Model model) { if (env.acceptsProfiles("default")) {
 StringWriter stackTrace = new StringWriter();
 e.printStackTrace(new PrintWriter(stackTrace));
 stackTrace.flush();
 model.addAttribute("status", status.value());
 model.addAttribute("error", status.getReasonPhrase());
 model.addAttribute("exception", e.getClass());
 model.addAttribute("message", e.getMessage());
 model.addAttribute("trace", stackTrace.toString());
 }
 }
  • 30. © 2016 Pivotal Software, Inc. All rights reserved. Profile • java -jar app.jar --spring.profiles.active=prod • java -jar -Dspring.profiles.active=prod app.jar • export SPRING_PRPFILES_ACTIVE=prod Cloud Foundry cloud
  • 31. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 32. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 33. © 2016 Pivotal Software, Inc. All rights reserved. Spring Data REST REST API <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-rest</artifactId>
 </dependency>
  • 34. © 2016 Pivotal Software, Inc. All rights reserved. public interface FooRepository extends CrudRepository<Foo, Long> { 
 } Repository --> REST API
  • 35. © 2016 Pivotal Software, Inc. All rights reserved. public interface FooRepository extends CrudRepository<Foo, Long> { 
 } Repository --> REST API GET /foos POST /foos GET /foos/{fooId} PUT /foos/{fooId} DELETE /foos/{fooId} PATCH /foos/{fooId} ...
  • 36. © 2016 Pivotal Software, Inc. All rights reserved. Repository --> REST API public interface FooRepository extends PagingAndSortingRepository<Foo, Long> { 
 }
  • 37. © 2016 Pivotal Software, Inc. All rights reserved. Repository --> REST API public interface FooRepository extends PagingAndSortingRepository<Foo, Long> { 
 } GET /foos?page={page} &size={size}&sort={sort} ...
  • 38. © 2016 Pivotal Software, Inc. All rights reserved. Repository --> REST API public interface FooRepository extends PagingAndSortingRepository<Foo, Long> { List<Foo> findByName(String name);
 }
  • 39. © 2016 Pivotal Software, Inc. All rights reserved. Repository --> REST API public interface FooRepository extends PagingAndSortingRepository<Foo, Long> { List<Foo> findByName(String name);
 } GET /foos/search/findByName?name={name} ...
  • 40. © 2016 Pivotal Software, Inc. All rights reserved. Repository --> REST API public interface FooRepository extends Repository<Foo, Long> { @RestResource(exported = false) List<Foo> findBySeminarId(Long seminarId); Optional<Foo> findOne(Long id); void save(Foo foo); 
 }
  • 41. © 2016 Pivotal Software, Inc. All rights reserved. Repository --> REST API public interface FooRepository extends Repository<Foo, Long> { @RestResource(exported = false) List<Foo> findBySeminarId(Long seminarId); Optional<Foo> findOne(Long id); void save(Foo foo); 
 } GET /foos/{id} POST /foos
  • 42. © 2016 Pivotal Software, Inc. All rights reserved. RepositoryEventHandler Traditional Spring Data REST Controller Service Repository Repository EventHandler
  • 43. © 2016 Pivotal Software, Inc. All rights reserved. RepositoryEventHandler @RepositoryEventHandler @Component public class UsernameEventHandler { @HandleReforeCreate void setUsername(UsernameHolder holder) { String username = SecurityContextHolder .getContext().getAuthentication() .getName(); holder.setUsername(username); }
 }
  • 44. © 2016 Pivotal Software, Inc. All rights reserved. RepositoryEventHandler @RepositoryEventHandler @Component public class UsernameEventHandler { @HandleReforeCreate void setUsername(UsernameHolder holder) { String username = SecurityContextHolder .getContext().getAuthentication() .getName(); holder.setUsername(username); }
 } UserHolder username
  • 45. © 2016 Pivotal Software, Inc. All rights reserved. Bean Validation @Configuration public class RestConfig extends RepositoryRestConfigurerAdapter { private final Validator vldtr; /* constructor */ @Override public void configureValidatingRepositoryEventListener(...) { lstnr.addValidator("beforeCreate", vldtr); lstnr.addValidator("beforeSave", vldtr); } }
  • 46. © 2016 Pivotal Software, Inc. All rights reserved. Bean Validation @Configuration public class RestConfig extends RepositoryRestConfigurerAdapter { private final Validator vldtr; /* constructor */ @Override public void configureValidatingRepositoryEventListener(...) { lstnr.addValidator("beforeCreate", vldtr); lstnr.addValidator("beforeSave", vldtr); } } { "errors": [{ "entity": "ResponseForSession", "property": "difficulty", "invalidValue": null, "message": "may not be null" }, { "entity": "ResponseForSession", "property": "satisfaction", "invalidValue": null, "message": "may not be null" } ] }
  • 47. © 2016 Pivotal Software, Inc. All rights reserved. Traditional Spring Data REST Controller Service Repository Repository EventHandler @Transactional
  • 48. © 2016 Pivotal Software, Inc. All rights reserved. Traditional Spring Data REST Controller Service Repository Repository EventHandler @Transactional RepositoryEntity Controller
  • 49. © 2016 Pivotal Software, Inc. All rights reserved. Traditional Spring Data REST Controller Service Repository Repository EventHandler @Transactional RepositoryEntity Controller
  • 50. © 2016 Pivotal Software, Inc. All rights reserved. Traditional Spring Data REST Controller Service Repository Repository EventHandler @Transactional RepositoryEntity Controller AOP
  • 51. © 2016 Pivotal Software, Inc. All rights reserved. • https://blog.ik.am/entries/403
  • 52. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 53. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 54. © 2016 Pivotal Software, Inc. All rights reserved. CSRF • Spring Security CSRF • Ajax / SPA
  • 55. © 2016 Pivotal Software, Inc. All rights reserved. CSRF • Spring Security CSRF • Ajax / SPA public class SecurityConfig extends WebSecurityConfigurerAdapter {
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http.csrf().disable()/* ... */; } }
  • 56. © 2016 Pivotal Software, Inc. All rights reserved. CSRF • Spring Security CSRF • Ajax / SPA public class SecurityConfig extends WebSecurityConfigurerAdapter {
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http.csrf().disable()/* ... */; } } 🙅
  • 57. © 2016 Pivotal Software, Inc. All rights reserved. $.post('/user', { firstName: 'Fred', lastName: 'Flintstone', _csrf: $('input[name=_csrf]').val() }); $(document).ajaxSend(function(e, xhr, options) { var token = $('input[name=_csrf]').val(); xhr.setRequestHeader('X-CSRF-TOKEN', token); }); OR
  • 58. © 2016 Pivotal Software, Inc. All rights reserved. I don't like jQuery 😟
  • 59. © 2016 Pivotal Software, Inc. All rights reserved. public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override
 protected void configure(HttpSecurity http) throws Exception {
 http./* ... * /and().csrf()
 .csrfTokenRepository( CookieCsrfTokenRepository .withHttpOnlyFalse());
 }
 }
  • 60. © 2016 Pivotal Software, Inc. All rights reserved.
  • 61. © 2016 Pivotal Software, Inc. All rights reserved. HTTP (_csrf) HTTP (X-CSRF-TOKEN) CSRF HTTP ( )
  • 62. © 2016 Pivotal Software, Inc. All rights reserved. HTTP (_csrf) HTTP (X-CSRF-TOKEN) CSRF HTTP ( ) HTTP (_csrf) HTTP (X-XSRF-TOKEN) CSRF Cookie(name=XSRF-TOKEN, httpOnly)
  • 63. © 2016 Pivotal Software, Inc. All rights reserved. Axios • https://github.com/mzabriskie/axios • node.js Promise HTTP • XSRF-TOKEN Cookie HTTP X-XSRF-TOKEN (AngularJS )
  • 64. © 2016 Pivotal Software, Inc. All rights reserved. Axios • https://github.com/mzabriskie/axios • node.js Promise HTTP • XSRF-TOKEN Cookie HTTP X-XSRF-TOKEN (AngularJS ) axios.post('/response_for_seminar', { comment: 'Great!', request: 'Sushi!' }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
  • 65. © 2016 Pivotal Software, Inc. All rights reserved.
  • 66. © 2016 Pivotal Software, Inc. All rights reserved.
  • 67. © 2016 Pivotal Software, Inc. All rights reserved.
  • 68. © 2016 Pivotal Software, Inc. All rights reserved.
  • 69. © 2016 Pivotal Software, Inc. All rights reserved.
  • 70. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 71. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 72. © 2016 Pivotal Software, Inc. All rights reserved. OAuth2 SSO with GitHub <dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-oauth2</artifactId>
 </dependency>
  • 73. © 2016 Pivotal Software, Inc. All rights reserved. Authorization Code (grant_type=authorization_code) Authorization Server (GitHub) Web UI Resource Server (GitHub API)
  • 74. © 2016 Pivotal Software, Inc. All rights reserved. Authorization Code (grant_type=authorization_code) Authorization Server (GitHub) Web UI Resource Server (GitHub API) authorize
  • 75. © 2016 Pivotal Software, Inc. All rights reserved. Authorization Code (grant_type=authorization_code) Authorization Server (GitHub) Web UI Resource Server (GitHub API) authorize redirect
  • 76. © 2016 Pivotal Software, Inc. All rights reserved. Authorization Code (grant_type=authorization_code) Authorization Server (GitHub) Web UI Resource Server (GitHub API) authorize redirect code
  • 77. © 2016 Pivotal Software, Inc. All rights reserved. Authorization Code (grant_type=authorization_code) Authorization Server (GitHub) Web UI Resource Server (GitHub API) authorize redirect code code
  • 78. © 2016 Pivotal Software, Inc. All rights reserved. Authorization Code (grant_type=authorization_code) Authorization Server (GitHub) Web UI Resource Server (GitHub API) authorize redirect code code token
  • 79. © 2016 Pivotal Software, Inc. All rights reserved. Authorization Code (grant_type=authorization_code) Authorization Server (GitHub) Web UI Resource Server (GitHub API) authorize redirect code code token token
  • 80. © 2016 Pivotal Software, Inc. All rights reserved. Authorization Code (grant_type=authorization_code) Authorization Server (GitHub) Web UI Resource Server (GitHub API) authorize redirect code code token token response
  • 81. © 2016 Pivotal Software, Inc. All rights reserved. @EnableOAuth2Sso @SpringBootApplication @EnableOAuth2Sso
 public class EnqueteApplication {
 public static void main(String[] args) {
 SpringApplication.run(EnqueteApplication.class, args);
 } }
  • 82. © 2016 Pivotal Software, Inc. All rights reserved. security.oauth2.client.client-id=xxxxx security.oauth2.client.client-secret=xxxxx security.oauth2.client.access-token- uri=https://github.com/login/oauth/access_token security.oauth2.client.user-authorization- uri=https://github.com/login/oauth/authorize
 security.oauth2.resource.user-info-uri=https:// api.github.com/user
  • 83. © 2016 Pivotal Software, Inc. All rights reserved.
  • 84. © 2016 Pivotal Software, Inc. All rights reserved.
  • 85. © 2016 Pivotal Software, Inc. All rights reserved. PrincipalExtractor / AuthoritiesExtractor public interface PrincipalExtractor {
 Object extractPrincipal(Map<String, Object> map); } public interface AuthoritiesExtractor {
 List<GrantedAuthority> extractAuthorities(Map<String, Object> map); }
  • 86. © 2016 Pivotal Software, Inc. All rights reserved. public EnqUserPrincipalExtractor implements AuthoritiesExtractor { @Override
 Object extractPrincipal(Map<String, Object> map){ return new EnqUser(map.get("name"), map.get("email"), map.get("avatar_url")); } }
  • 87. © 2016 Pivotal Software, Inc. All rights reserved. public EnqUserPrincipalExtractor implements AuthoritiesExtractor { @Override
 Object extractPrincipal(Map<String, Object> map){ return new EnqUser(map.get("name"), map.get("email"), map.get("avatar_url")); } } security.oauth2.resource.user-info-uri
  • 88. © 2016 Pivotal Software, Inc. All rights reserved. public EnqUserAuthoritiesExtractor implements PrincipalExtractor { @Override
 List<GrantedAuthority> extractAuthorities(Map<String, Object> map){ return Arrays.asList( !"making".equals(map.get("login")) ? new SimpleGrantAuthority("ROLE_USER") : new SimpleGrantAuthority("ROLE_ADMIN") ) }
  • 89. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server
  • 90. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server authorize
  • 91. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server authorize redirect
  • 92. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server authorize redirect code
  • 93. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server authorize redirect code code
  • 94. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server authorize redirect code code token
  • 95. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server authorize redirect code code token token
  • 96. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server authorize redirect code code token token response
  • 97. © 2016 Pivotal Software, Inc. All rights reserved. GitHub OK Authorization Server Web UI Resource Server authorize redirect code code token token response @EnableAuthorizationServer @EnableResourceServer
  • 98. © 2016 Pivotal Software, Inc. All rights reserved. UI SSO Authorization Server Web UI Resource ServerAnother Web UI
  • 99. © 2016 Pivotal Software, Inc. All rights reserved. • https://github.com/Pivotal-Japan/spring-security-oauth- workshop
  • 100. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 101. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 102. © 2016 Pivotal Software, Inc. All rights reserved. public interface UrlShortenerClient {
 String shorten(String longUrl); }
  • 103. © 2016 Pivotal Software, Inc. All rights reserved.
  • 104. © 2016 Pivotal Software, Inc. All rights reserved. @ConditionalOnProperty
  • 105. © 2016 Pivotal Software, Inc. All rights reserved. @Component @ConditionalOnProperty(name = "enquete.bitly.access-token") public BitlyClient implements UrlShortenerClient { @Override
 String shorten(String longUrl) { String token = props.getBitly() .getAccessToken(); /* ... */ } } Bit.ly URL
  • 106. © 2016 Pivotal Software, Inc. All rights reserved. @Component @ConditionalOnProperty(name = "enquete.googl.api-key") public GooglClient implements UrlShortenerClient { @Override
 String shorten(String longUrl) { String apiKey = props.getGoogl().getApiKey(); /* ... */ } } Goo.gl URL
  • 107. © 2016 Pivotal Software, Inc. All rights reserved. enquete.bitly.access-token=0123456789 enquete.googl.api-key=abcdef BitlyClient GooglClient
  • 108. © 2016 Pivotal Software, Inc. All rights reserved. @Controller public SeminarController { final Optional<UrlShortenerClient> shortener;
 @GetMapping("seminars/{seminarId}")
 public String list(...) { shortener.ifPresent(x -> { String shorten = x.shorten(url); model.addAttribute("shorten", shorten); }); /* ... */ } }
  • 109. © 2016 Pivotal Software, Inc. All rights reserved.
  • 110. © 2016 Pivotal Software, Inc. All rights reserved. enquete.bitly.access-token=0123456789
  • 111. © 2016 Pivotal Software, Inc. All rights reserved. enquete.bitly.access-token=0123456789
  • 112. © 2016 Pivotal Software, Inc. All rights reserved. enquete.bitly.access-token=0123456789enquete.googl.api-key=abcdef
  • 113. © 2016 Pivotal Software, Inc. All rights reserved. enquete.bitly.access-token=0123456789enquete.googl.api-key=abcdef
  • 114. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 115. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 116. © 2016 Pivotal Software, Inc. All rights reserved. @ConfigurationProperties @ConfigurationProperties(prefix = "enquete") @Component @Validated public class EnqProps {
 private Set<String> adminUsers; private Bitly bitly; public static class Bitly {
 private String accessToken;
 } // setter/getter }
  • 117. © 2016 Pivotal Software, Inc. All rights reserved. Configuration Processor <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</scope>
 </dependency>
  • 118. © 2016 Pivotal Software, Inc. All rights reserved.
  • 119. © 2016 Pivotal Software, Inc. All rights reserved.
  • 120. © 2016 Pivotal Software, Inc. All rights reserved.
  • 121. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 122. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 123. © 2016 Pivotal Software, Inc. All rights reserved. Spring Boot Actuator >= 1.5 • (ROLE_ACTUATOR) • /info, /health (status ) management.security.enabled=false application-default.properties
  • 124. © 2016 Pivotal Software, Inc. All rights reserved. Spring Boot Actuator >= 1.5 • (ROLE_ACTUATOR) • /info, /health (status ) management.security.enabled=false application-default.properties profile default disabled
  • 125. © 2016 Pivotal Software, Inc. All rights reserved. ROLE_ACTUATOR public EnqUserAuthoritiesExtractor /* ... */ { @Override
 List<GrantedAuthority> extractAuthorities(Map<String, Object> map){ return !"making".equals(map.get("login")) ? asList(new SimpleGrantAuthority("ROLE_USER")) : asList(new SimpleGrantAuthority("ROLE_ADMIN"), new SimpleGrantAuthority("ROLE_ACTUATOR")) } }
  • 126. © 2016 Pivotal Software, Inc. All rights reserved. BeansViz <dependency>
 <groupId>am.ik.beansviz</groupId>
 <artifactId>beansviz-spring-boot-actuator</artifactId>
 <version>0.1.0</version> </dependency>
  • 127. © 2016 Pivotal Software, Inc. All rights reserved. BeansViz <dependency>
 <groupId>am.ik.beansviz</groupId>
 <artifactId>beansviz-spring-boot-actuator</artifactId>
 <version>0.1.0</version> </dependency> Actuator /beansviz /beans Graphviz
  • 128. © 2016 Pivotal Software, Inc. All rights reserved.
  • 129. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 130. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 131. © 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry Integration
  • 132. © 2016 Pivotal Software, Inc. All rights reserved. Cloud Foundry Integration
  • 133. © 2016 Pivotal Software, Inc. All rights reserved.
  • 134. © 2016 Pivotal Software, Inc. All rights reserved.
  • 135. © 2016 Pivotal Software, Inc. All rights reserved. • https://blog.ik.am/entries/401
  • 136. © 2016 Pivotal Software, Inc. All rights reserved. Error Spring Data REST CSRF @EnableOAuth2Sso @ConditionalOnProperty Configuration Properties Spring Boot Actuator Cloud Foundry Integration
  • 137. © 2016 Pivotal Software, Inc. All rights reserved. Check Source code! https://github.com/openenquete/enquete
  • 138. © 2016 Pivotal Software, Inc. All rights reserved. Spring Cloud Services in PWS • https://content.pivotal.io/blog/building-spring-microservices- with-cloud-foundrys-new-container-networking-stack
  • 139. © 2016 Pivotal Software, Inc. All rights reserved. Check Tutorials!! •https://github.com/Pivotal-Japan •https://pivotal-japan.connpass.com/