我需要使用Acegi/Spring安全性连接现有应用程序.
为了开始,我正在寻找一个简单的信息:在这个上下文中,从我的应用程序调用的HttpServletRequest.getUserPrincipal()是否正确返回通过Spring获得的用户名(而不是使用特定于Spring的对象)?我用Google搜索了相互矛盾的信息.
我假设如果使用过滤器实现Acegi,它可以重载Servlet API的getUserPrincipal(),对吗?
附属问题:如果默认不是这种情况,有没有办法打开它?
谢谢,
-Erik
我想在Scala XML Elem对象和XML元素的另一种表示之间隐式转换,在我的例子中是dom4j Element.我写了以下隐式转换:
implicit def elemToElement(e: Elem): Element = ... do conversion here ...
implicit def elementToElem(e: Element): Elem = ... do conversion here ...
Run Code Online (Sandbox Code Playgroud)
到目前为止,这很好,这是有效的.
现在我还需要所有元素的集合来转换两种方式.首先,我是否绝对需要编写其他转换方法?如果我没有,事情似乎没有用.
我试着写下面的内容:
implicit def elemTToElementT(t: Traversable[Elem]) = t map (elemToElement(_))
implicit def elementTToElemT(t: Traversable[Element]) = t map (elementToElem(_))
Run Code Online (Sandbox Code Playgroud)
这看起来并不太理想,因为如果转换方法采用Traversable,那么它也会返回Traversable.如果我传递一个List,我也会得到一个Traversable.所以我假设转换应该以某种方式进行参数化.
那么,为了尽可能通用,编写这些转换的标准方法是什么?
考虑一下Map[String, Any]:
val m1 = Map(("k1" -> "v1"), ("k2" -> 10))
Run Code Online (Sandbox Code Playgroud)
现在让我们写一个for:
scala> for ((a, b) <- m1) println(a + b)
k1v1
k210
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
现在让我们指定第二个成员的类型:
scala> for ((a, b: String) <- m1) println(a + b)
k1v1
scala> for ((a, b: Integer) <- m1) println(a + b)
k210
Run Code Online (Sandbox Code Playgroud)
在这里,当我指定一个类型时,会发生过滤,这很好.
现在说我想使用数组[Any]代替:
val l1 = Array("a", 2)
Run Code Online (Sandbox Code Playgroud)
事情破裂了:
scala> for (v: String <- l1) println(v)
<console>:7: error: type mismatch;
found : (String) => Unit
required: (Any) => ?
Run Code Online (Sandbox Code Playgroud)
我的双重问题是: …
如何使用for-comprehension返回可以分配给有序Map的内容?这是我所拥有的代码的简化:
class Bar
class Foo(val name: String, val bar: Bar)
val myList: java.util.List[Foo] = ...
val result: ListMap[String, Bar] =
for {
foo <- myList
} yield (foo.name, foo.bar)
Run Code Online (Sandbox Code Playgroud)
我需要确保我的结果是一个有序的Map,顺序是从for-comprehension返回的元组.
有了上述,我得到错误:
error: type mismatch;
found : scala.collection.mutable.Buffer[(String,Bar)]
required: scala.collection.immutable.ListMap[String,Bar]
foo <- myList
Run Code Online (Sandbox Code Playgroud)
这编译:
class Bar
class Foo(val name: String, val bar: Bar)
val myList: java.util.List[Foo] = ...
val result: Predef.Map[String, Bar] =
{
for {
foo <- myList
} yield (foo.name, foo.bar)
} toMap
Run Code Online (Sandbox Code Playgroud)
但后来我假设地图不会被排序,我需要一个明确的toMap调用.
我怎样才能做到这一点?
我有一个功能,说:
setValue: function(myValue) {
...
}
Run Code Online (Sandbox Code Playgroud)
调用者可以传递字符串,数字,布尔值或对象.我需要确保在行下面传递的值是一个字符串.这样做最安全的方法是什么?我意识到有很多方法可以将某些类型(例如Date)转换为字符串,但我只是在寻找合理的开箱即用的东西.
我可以写一系列类型的陈述:
if (typeof myValue == "boolean") {}
else if () {}
...
Run Code Online (Sandbox Code Playgroud)
但这可能容易出错,因为类型可能会被遗漏.
Firefox似乎支持编写如下内容:
var foo = 10; foo.toString()
Run Code Online (Sandbox Code Playgroud)
但这适用于所有网络浏览器吗?我需要支持IE 6及更高版本.
简而言之,在覆盖每一种类型时进行转换的最短方法是什么?
-Erik