Я использовал функцию SpringPostProcessor для этого.
Вам нужно создать такой класс:
public class ReadDbPropertiesPostProcessor implements EnvironmentPostProcessor {
/**
* Name of the custom property source added by this post processor class
*/
private static final String PROPERTY_SOURCE_NAME = "databaseProperties";
/**
* Adds Spring Environment custom logic. This custom logic fetch properties from database and setting highest precedence
*/
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> propertySource = new HashMap<>();
try {
// Build manually datasource to ServiceConfig
DataSource ds = DataSourceBuilder
.create()
.username(USERNAME) // replace with your config
.password(PASSWORD) // replace with your config
.url(DATASOURCE-URL)// replace with your config
.driverClassName(DRIVER) // replace with your config
.build();
// Fetch all properties
PreparedStatement preparedStatement = ds.getConnection().prepareStatement("SELECT name, value FROM propertyConfig WHERE service = ?");
preparedStatement.setString(1, APP_NAME);
ResultSet rs = preparedStatement.executeQuery();
// Populate all properties into the property source
while (rs.next()) {
String propName = rs.getString("name");
propertySource.put(propName, rs.getString("value"));
}
// Create a custom property source with the highest precedence and add it to Spring Environment
environment.getPropertySources().addFirst(new MapPropertySource(PROPERTY_SOURCE_NAME, propertySource));
} catch (Exception e) {
throw new RuntimeException("Error fetching properties from db");
}
}
}
Поскольку вам нужно запустить этот класс в очень на ранней стадии весны вам нужно создать файл spring.factories
и зарегистрировать почтовый процессор среды. Этот файл должен быть расположен здесь:
src/main/META-INF/spring-factories
В содержимом вам нужно установить свой класс в свойство spring:
# Environment Post Processor
org.springframework.boot.env.EnvironmentPostProcessor=com.your.package.ReadDbPropertiesPostProcessor
Вот решение для вашего первоначального вопроса . Попытка помочь была бы бесполезной, если у вас есть изменяющийся Вопрос и вы продолжаете изменять Вопрос
position: sticky
не работает с элементами таблицы. Так как top
и bottom
не работают в элементах таблицы, мы можем сделать только высоту строки незакрепленного элемента td
, чтобы sticky
td
не перекрывались над non-sticky
td
[ 1121]
<div>
<table>
<tr>
<td class="sticky left">Sticky</td>
<td class="sticky" colspan="9">How can I make this sticky?</td>
</tr>
<tr class="tableBody">
<td>Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
</table>
</div>
Добавьте class
left
для липкого тд, который остается на левой стороне. Аналогичным образом управляйте значением left
в других td
. Кроме того, добавьте немного class
для нелипкого td
как tableBody
в этом примере:
div {
width: 300px;
overflow: scroll;
}
.sticky {
position: fixed;
left: 50px;
background: white;
}
.left{
left:0;
}
tr.tableBody
{
line-height:50px;
}
Наконец добавьте желаемый CSS
.
На самом деле это уже липко, проблема в том, что ширина тд не дает поводов для движения. Поэтому, чтобы сделать их липкими, измените colspan на втором тд (чтобы сделать его еще лучше, оставьте также 50 пикселей слева, чтобы они двигались рядом друг с другом). Надеюсь, что это удивило ваш вопрос.
ОБНОВЛЕНИЕ :
colspan на 2-й день, почему ваш код не работает, я исправил это, заменив структуру на эту
<tr class="darkblue">
<td class="sticky-row">Sticky Row 1</td>
<td class="sticky-row" colspan>How can I make this sticky?</td>
<td colspan="8"></td>
</tr>
и добавил дополнительный класс CSS, чтобы исправить цвет фона tr
.darkblue {
background: #1C4464;
width: 100%;
}
.sticky-row {
position: sticky;
position: -webkit-sticky;
left: 0;
top: 23px;
color: white;
z-index: 3;
}
Полный код для справки внизу
body {
font-family: 'Lucida Grande';
}
div {
width: 500px;
height: 200px;
overflow: scroll;
}
td,
th {
padding: 2px 5px;
white-space: nowrap;
}
.sticky-header {
position: sticky;
position: -webkit-sticky;
top: 0;
background: #146775;
color: white;
z-index: 3;
}
.sticky-header:first-child {
left: 0;
z-index: 4;
}
.darkblue {
background: #1C4464;
width: 100%;
}
.sticky-row {
position: sticky;
position: -webkit-sticky;
left: 0;
top: 23px;
/* background: #1C4464; */
color: white;
z-index: 3;
}
.sticky-row:nth-child(2) {
left: 100px; /* How can I make this dynamic? */
z-index: 2;
}
span {
position: absolute;
top: 2px;
left: 113px;
}
.sticky-column {
position: sticky;
position: -webkit-sticky;
left: 0;
background: #569CA8;
color: white;
z-index: 1;
width: 100px; /* How can I make this dynamic? */
}
<div>
<table cellspacing="0">
<thead>
<tr>
<td class="sticky-header">Header 1</td>
<td class="sticky-header">Header 2</td>
<td class="sticky-header">Header 3</td>
<td class="sticky-header">Header 4</td>
<td class="sticky-header">Header 5</td>
<td class="sticky-header">Header 7</td>
<td class="sticky-header">Header 8</td>
<td class="sticky-header">Header 9</td>
<td class="sticky-header">Header 10</td>
</tr>
</thead>
<tbody>
<tr class="darkblue">
<td class="sticky-row">Sticky Row 1</td>
<td class="sticky-row" colspan>How can I make this sticky?</td>
<td colspan="8"></td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr class="darkblue">
<td class="sticky-row">Sticky Row 2<span>Dirty way of making sticky</span></td>
<td class="sticky-row" colspan="9"></td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-row">Sticky Row 3</td>
<td class="sticky-row" colspan="9">How can I make this sticky?</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
<tr>
<td class="sticky-column">Column 1</td>
<td>Column 2</td>
<td>Column 3</td>
<td>Column 4</td>
<td>Column 5</td>
<td>Column 7</td>
<td>Column 8</td>
<td>Column 9</td>
<td>Column 10</td>
</tr>
</tbody>
</table>
</div>