使用Grails,这个:
[[a:1]] as grails.converters.JSON
Run Code Online (Sandbox Code Playgroud)
返回不同的东西
(grails.converters.JSON)[[a:1]]
Run Code Online (Sandbox Code Playgroud)
但两者都或多或少地按预期工作,所以我假设两个调用都由JSON类处理,但是由不同的方法(或参数)处理.
我知道as调用asType方法,但是在调用转换时调用了什么?
编辑:
我最初认为它不相关,但为了完整性,'as'返回
[{"a":1}]
Run Code Online (Sandbox Code Playgroud)
而铸造回来了
{"a":1}
Run Code Online (Sandbox Code Playgroud)
如果列表包含多个项目,则两者都返回相同的项目.此外,在这两种情况下,两个方法都返回一个类为grails.converters.JSON的对象.
如果它增加任何值,我尝试使用Grails 2.2.4.
Grails可以创建简单的字符串/值映射属性部分"对象映射",第一段.
我想知道,有没有办法稍后使用map属性作为查询的一部分查询域类(使用Gorm动态查找器,标准或HQL)(即为键X添加条件以使值Y)?
使用具有类似于以下内容的类类层次结构的grails时:
abstract class Vehicle { ... }
class Car extends Vehicle { ... }
class Motorcycle extends Vehicle { ... }
Run Code Online (Sandbox Code Playgroud)
以及如下服务:
class VehicleService {
def startRepairing(Car car) { ... }
def startRepairing(Motorcycle motorcycle) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我们经常在生产中遇到以下错误:
没有方法签名:VehicleService.startRepairing()适用于参数类型:(Car _ $$ _ javassist_156)值:[Id:42343,Class:Car].可能的解决方案:startRepairing(Car)
我们认为,这是因为我们检索Vehicle从一个集合,如实例static hasMany = [vehicles: Vehicle],这将导致代理实现的抽象类Vehicle而不是具体类(Car,Motorcycle,等).
我们曾经从方法中删除参数类型作为解决方案,但我们宁愿拥有它 - 代码更清晰,方法重载是可能的,更友好的IDE ...
我们考虑的一个解决方案是当类型与任何其他方法不匹配时使用臭名昭着的GrailsHibernateUtil.unwrapIfProxy:
class VehicleService {
def startRepairing(Vehicle vehicle) {
startRepairing(GrailsHibernateUtil.unwrapIfProxy(vehicle))
}
def startRepairing(Car car) {
/* actual business …Run Code Online (Sandbox Code Playgroud) 在使用Grails时,我喜欢尽可能依靠自动数据绑定和脚手架.我有以下问题.我有一个域类Flow,它有一个Domain类Node实例的集合,是最新的一个抽象类:
class Flow {
List nodes
static hasMany = [ nodes: Node]
static constraints = { nodes minSize:1 }
}
abstract class Node {
String title
static belongsTo = [ ownerFlow: Flow]
}
Run Code Online (Sandbox Code Playgroud)
有几个类继承自Node.尝试使用数据绑定创建Flow时,以下集成测试失败:
void "a flow can be created from a single request using the default grails data binding"() {
when:
def controller = new FlowController()
controller.request.addParameters(['nodes[0].title': 'First step'])
new Flow(controller.params).save(flush:true)
then:
Flow.count() > 0
}
}
Run Code Online (Sandbox Code Playgroud)
当我将Node从抽象更改为非抽象时,测试通过.它完全有道理,因为Grails无法创建node [0]实例,因为Node是一个抽象类,但问题是:
技术上是完全可能的(实际上Grails已经做了类似的事情,通过使用classname列来持久化和检索实例),但我不确定数据绑定中是否已经考虑过这种情况.如果不: