关于com.typesafe.config读取自定义对象及配置创建的技术咨询
Great question! Let’s tackle this one step at a time.
Yes, you’re absolutely right! The Lightbend Config library (formerly Typesafe Config) provides built-in methods to parse values into basic types like Integer, Boolean, String, and collections—but it doesn’t offer out-of-the-box support for directly resolving config values into custom objects. Its core focus is on handling hierarchical, flexible config data, leaving object mapping to either manual implementation or third-party libraries.
First, let’s structure your desired config using HOCON (Human-Optimized Config Object Notation), the default format for Lightbend Config. Save this as application.conf in your project’s classpath:
cookie { cookieName = "id" cookiePath = "/" cookieDomain = null # Represents "None" in your requirement secureCookie = true httpOnlyCookie = true useFingerprinting = true cookieMaxAge = 86400 # Example: 1 day in seconds; adjust as needed }
Note: In HOCON, null is used to represent an absent/None value, which aligns with your cookieDomain = None requirement.
Since there’s no native method for this, you have two common, practical approaches:
Option 1: Manual mapping (no third-party dependencies)
First, define your custom object class (Java example; the approach is nearly identical for Scala):
public class CookieConfig { private String cookieName; private String cookiePath; private String cookieDomain; // Null represents "None" private boolean secureCookie; private boolean httpOnlyCookie; private boolean useFingerprinting; private int cookieMaxAge; // Constructor public CookieConfig(String cookieName, String cookiePath, String cookieDomain, boolean secureCookie, boolean httpOnlyCookie, boolean useFingerprinting, int cookieMaxAge) { this.cookieName = cookieName; this.cookiePath = cookiePath; this.cookieDomain = cookieDomain; this.secureCookie = secureCookie; this.httpOnlyCookie = httpOnlyCookie; this.useFingerprinting = useFingerprinting; this.cookieMaxAge = cookieMaxAge; } // Getters (add setters if needed) public String getCookieName() { return cookieName; } public String getCookiePath() { return cookiePath; } public String getCookieDomain() { return cookieDomain; } public boolean isSecureCookie() { return secureCookie; } public boolean isHttpOnlyCookie() { return httpOnlyCookie; } public boolean isUseFingerprinting() { return useFingerprinting; } public int getCookieMaxAge() { return cookieMaxAge; } }
Then, read the config and map it to your custom object:
import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; public class ConfigLoader { public static void main(String[] args) { // Load the main config file Config rootConfig = ConfigFactory.load(); // Extract the cookie-specific sub-config Config cookieConfig = rootConfig.getConfig("cookie"); // Manually map config values to your custom object CookieConfig customCookieConfig = new CookieConfig( cookieConfig.getString("cookieName"), cookieConfig.getString("cookiePath"), // Handle the "None" case: check if the path exists and isn't null cookieConfig.hasPath("cookieDomain") && !cookieConfig.isNull("cookieDomain") ? cookieConfig.getString("cookieDomain") : null, cookieConfig.getBoolean("secureCookie"), cookieConfig.getBoolean("httpOnlyCookie"), cookieConfig.getBoolean("useFingerprinting"), cookieConfig.getInt("cookieMaxAge") ); // Use your custom object as needed System.out.println("Cookie name: " + customCookieConfig.getCookieName()); } }
Option 2: Use Jackson for automatic mapping (third-party library)
If you want to avoid repetitive manual mapping, use Jackson’s jackson-datatype-config module, which integrates seamlessly with Lightbend Config.
First, add the dependency (Maven example):
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-config</artifactId> <version>2.15.2</version> <!-- Use the latest stable version --> </dependency>
Update your CookieConfig class to include a default constructor (required by Jackson) or use Jackson annotations:
public class CookieConfig { private String cookieName; private String cookiePath; private String cookieDomain; private boolean secureCookie; private boolean httpOnlyCookie; private boolean useFingerprinting; private int cookieMaxAge; // Default constructor for Jackson public CookieConfig() {} // Getters and setters (Jackson requires these for deserialization) public String getCookieName() { return cookieName; } public void setCookieName(String cookieName) { this.cookieName = cookieName; } public String getCookiePath() { return cookiePath; } public void setCookiePath(String cookiePath) { this.cookiePath = cookiePath; } public String getCookieDomain() { return cookieDomain; } public void setCookieDomain(String cookieDomain) { this.cookieDomain = cookieDomain; } public boolean isSecureCookie() { return secureCookie; } public void setSecureCookie(boolean secureCookie) { this.secureCookie = secureCookie; } public boolean isHttpOnlyCookie() { return httpOnlyCookie; } public void setHttpOnlyCookie(boolean httpOnlyCookie) { this.httpOnlyCookie = httpOnlyCookie; } public boolean isUseFingerprinting() { return useFingerprinting; } public void setUseFingerprinting(boolean useFingerprinting) { this.useFingerprinting = useFingerprinting; } public int getCookieMaxAge() { return cookieMaxAge; } public void setCookieMaxAge(int cookieMaxAge) { this.cookieMaxAge = cookieMaxAge; } }
Then, use Jackson to deserialize the config directly into your custom object:
import com.fasterxml.jackson.databind.ObjectMapper; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import com.fasterxml.jackson.datatype.config.ConfigModule; public class JacksonConfigLoader { public static void main(String[] args) throws Exception { Config rootConfig = ConfigFactory.load(); Config cookieConfig = rootConfig.getConfig("cookie"); ObjectMapper objectMapper = new ObjectMapper(); // Register the Lightbend Config module for Jackson objectMapper.registerModule(new ConfigModule()); // Deserialize the config into your custom object CookieConfig customCookieConfig = objectMapper.readValue(cookieConfig.root(), CookieConfig.class); // Use your object System.out.println("Cookie domain: " + customCookieConfig.getCookieDomain()); } }
内容的提问来源于stack exchange,提问作者Manu Chadha

