Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/manual/working/javaGuide/main/sql/JavaEbean.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ As an example, the fairly common problem of reducing the sequence batch size in

Make sure that such a class is covered by an `ebean.` config line, for example by putting it into the `models` package. Play Ebean registers the configured classes with Ebean explicitly, which disables Ebean's own classpath scanning, so Ebean silently ignores any `ServerConfigStartup` that is not covered.

Note that Ebean doesn't read Play's `conf/application.conf`, so put Ebean's own settings (e.g. `ebean.migration.run`) into `conf/application.yaml`, which only Ebean reads, or into `conf/application.properties`. Play loads `conf/application.properties` as well, and Play Ebean ignores nested settings from there, like `ebean.migration.run`. However, a setting directly below `ebean.`, like `ebean.dumpMetricsOnShutdown=true`, looks like a list of models to Play Ebean, which only skips it because there's no database of that name. So prefer `conf/application.yaml` for such settings.

Note that Ebean will also make use of a `conf/orm.xml` file (if present), to configure `<entity-mappings>`.

#### Using a read replica
Expand Down
18 changes: 17 additions & 1 deletion play-ebean/src/main/java/play/db/ebean/EbeanParsedConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import play.Logger;

/**
* The raw parsed config from Ebean, as opposed to the EbeanConfig which actually requires starting
* database connection pools to create.
*/
public class EbeanParsedConfig {

private static final Logger.ALogger LOGGER = Logger.of(EbeanParsedConfig.class);

private final String defaultDatasource;

private final Map<String, List<String>> datasourceModels;
Expand Down Expand Up @@ -118,8 +121,21 @@ public static EbeanParsedConfig parseFromConfig(Config config) {
if (raw.valueType() == ConfigValueType.STRING) {
// Support legacy comma separated string
models = Arrays.asList(((String) raw.unwrapped()).split(","));
} else {
} else if (raw.valueType() == ConfigValueType.LIST) {
models = ebeanConfig.getStringList(key);
} else {
// No models, but e.g. one of Ebean's own settings, which Play also loads from
// conf/application.properties
if (raw.origin().description().contains(".conf")) {
LOGGER.warn(
"Ignoring {}.{} ({}), as it's no list of models and Ebean doesn't read"
+ " Play's configuration. Put Ebean's own settings into"
+ " conf/application.yaml or conf/application.properties instead.",
ebeanConfigKey,
key,
raw.origin().description());
}
return;
}

datasourceModels.put(key, models);
Expand Down
40 changes: 40 additions & 0 deletions play-ebean/src/test/java/play/db/ebean/EbeanParsedConfigTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@

import com.google.common.collect.ImmutableMap;
import com.typesafe.config.ConfigFactory;
import com.typesafe.config.ConfigParseOptions;
import com.typesafe.config.ConfigSyntax;
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import org.junit.*;

public class EbeanParsedConfigTest {
Expand Down Expand Up @@ -43,6 +46,43 @@ public void withDataSources() {
assertThat(config.getDatasourceModels().get("other"), hasItems("c"));
}

@Test
public void ignoresEbeanSettingsFromProperties() {
// Play also loads conf/application.properties, where all values are strings
EbeanParsedConfig config =
EbeanParsedConfig.parseFromConfig(
ConfigFactory.parseString(
"ebean.default=a\n"
+ "ebean.other.databasePlatformName=h2\n"
+ "ebean.migration.run=false\n"
+ "ebean.dumpMetricsOnShutdown=true\n",
ConfigParseOptions.defaults().setSyntax(ConfigSyntax.PROPERTIES))
.withFallback(ConfigFactory.defaultReference()));
// Nested settings get ignored, while a setting directly below ebean. looks like a list of
// models (of an Ebean server without a database, so it gets skipped later on)
assertThat(
config.getDatasourceModels().keySet(), equalTo(Set.of("default", "dumpMetricsOnShutdown")));
assertThat(config.getDatasourceModels().get("default"), hasItems("a"));
}

@Test
public void ignoresEbeanSettings() {
// Ebean's own settings in a .conf file (which Ebean doesn't read, though)
EbeanParsedConfig config =
parse(
ImmutableMap.of(
"ebean.default",
Collections.singletonList("a"),
"ebean.other.databasePlatformName",
"h2",
"ebean.migration.run",
false,
"ebean.dumpMetricsOnShutdown",
true));
assertThat(config.getDatasourceModels().keySet(), equalTo(Collections.singleton("default")));
assertThat(config.getDatasourceModels().get("default"), hasItems("a"));
}

@Test
public void commaSeparatedModels() {
EbeanParsedConfig config = parse(ImmutableMap.of("ebean.default", "a,b"));
Expand Down