Grails Service 层

groovy编写webservice服务端和客户端(含连接数据并输出JSON数据) NULL 博文链接:https://leon1509.iteye.com/blog/1541387 立即下载
Service 层


除了 Web 层 之外, Grails 还定义了service 层的概念。Grails 团队不赞成在controllers中嵌入核心的应用程序逻辑,因为这样并没有提升重用和清楚的关注点分离。
Grails中的Services在应用程序中被视为放置多数逻辑的地方 。从controllers脱离,负责处理通过重定向的请求流等等。
 
创建Service
你可以在终端窗口的项目根目录下运行 create-service 创建Service:
 
grails create-service simple
上面的示例将在grails-app/services/SimpleService.groovy位置创建一个Service。 service的名字按规约以 Service结尾。除此之外,service就是个普通的Groovy类:
 
class SimpleService {
}
1 声明式事务处理
Services一般涉及协调 domain 类之间的逻辑, , 因此常常涉及大范围的持久化操作。因为services性质,它们常常需要事物状态。你可以使用 withTransaction方法来编程事物,不过,这是重复性的,没有充分利用Spring强大的潜在事物抽象
Services允许启用事物,本质上是以声明的方式来声明service中的所有方法必须用于事物。默认情况下,所有services的事物都是可用的——禁用它,只需设置  transactional属性为 false:
 
class CountryService {
    static transactional = false
}


你也可以默认设置这个属性为 true 在以后改变它,或者清楚的表明这个服务是有意地用于事物。
 
警告: 依赖注入 是 唯一 声明事物工作的方式。你不能使用new操作符,像这样new 
BookService()获取事物服务
其结果是,所有的方法都被包含在事物中,当方法体中抛出异常时,自动回滚。事物的传播级别被默认设置为 PROPAGATION_REQUIRED.
2 服务作用域
默认情况下,存取服务方法是非同步的,所以无法阻止同步执行这些函数。事实上,因为服务是单例的,可以被同时使用,你必须非常小心服务中存储状态。或者采用容易(和更好的)途径并不在y service中存储状态。
你可以通过把service放置于特定的作用域来改变这样的行为:
prototype -一个新的service每次被注入到其他类时创建
request - 一个新的service在每次请求时创建
flash - 一个新的service只在当前或下个请求时创建
flow - 在web flows中, service将存在于flow的作用域
conversation - 在web flows中, service将存在于会话的作用域。根flow和它的子 flows
session - 一个service被创建用于session的作用域
singleton (默认) - 只有一个实例的service,任何时候都存在
 
假如你的service为flash, flow 或  conversation 作用域,它需要实现 java.io.Serializable 并只用于 Web Flow上下文
为了启用一个作用域,在你的类中添加一个静态scope属性,其值为上面所述的作用域之一:
 
static scope = "flow"


 
3 依赖注入与服务
依赖注入基础
Grails服务的一个重要方面是,有能力利用Spring 框架的依赖注入能力。 Grails支持 "依赖注入通过规约". 换句话说,你可以使用一个属性名表示的一个服务的类名,自动把他们注入到 controllers, tag libraries,等等。
作为示例,给定的服务名为BookService, 如果你像下面这样在controller中放置一个名为bookService 的属性:
 
class BookController {
   def bookService
   …
}


在这种情况下,Spring 容器将自动注入一个基于它自己配置作用域的服务实体。所有的依赖注入是通过名字的; Grails 不支持类型注入。你也可以像下面这样指定类型:
 
class AuthorService {
	BookService bookService
}


不过, 存在副作用,即在开发模式下BookService的改变会在加载时抛出一个错误。
 
依赖注入与服务
你可以使用相同的技术在一个服务中注入另一个服务。如果说,你的AuthorService需要一个  BookService, 可以像下面这样声明 AuthorService:
 
class AuthorService {
	def bookService
}
 


依赖注入与Domain类
你甚至可以在domain类中注入服务,这可以帮助开发出各种丰富的domain:
 
class Book {	
	…
	def bookService
	def buyBook() {
		bookService.buyBook(this)
	}
}


4 Using Services from Java
服务的强大在于它包含了可重用的逻辑,你可以使用来自其他类的服务,包括Java类。这里有一些方法让你重用来自Java的服务。简单的方法是把你的服务移动到grails-app/services目录下的一个包里。这是关键步骤,因为你不可能在Java中导入一个默认package 。作为示例, BookService 就是因为上面的原因,在下面Java中不能使用:
 
class BookService {
	void buyBook(Book book) {
		// logic
	}
}


不过, 把这个类放入一个package中便可修复,, 把这个类移动到  grails-app/services/bookstore子目录,然后,修改package 声明:
 
package bookstore
class BookService {
	void buyBook(Book book) {
		// logic
	}
}


package的替代是,定义个需要服务实现的接口:
 
package bookstore;
interface BookStore {
	void buyBook(Book book);
}


然后,服务:
 
class BookService implements bookstore.BookStore {
	void buyBook(Book b) {
		// logic
	}
}


后一种方法更熟悉, 在Java端,只需要接口的引用,而不需要实现类。无论哪种方式,这个练习的目的是,在编译时,让Java能够静态解决类(或接口)的使用。现在,这样便可在  src/java包内创建一个Java类,并提供了一个setter,在Spring中使用bean的类型和它的名字:
 
package bookstore;
// note: this is Java class
public class BookConsumer {
	private BookStore store;
	public void setBookStore(BookStore storeInstance) {
		this.store = storeInstance;
	}	
	…
}


这样一来,你可以在  grails-app/conf/spring/resources.xml中把这个Java当做Spring bean来配置 (更多详情查看 Grails and Spring):
 
<bean id="bookConsumer" class="bookstore.BookConsumer">
	<property name="bookStore" ref="bookService" />
</bean>


神经网络基础-从零开始搭建一个神经网络 人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。人工神经网络也是类似,通过模仿人脑的“学习机器”,通过不断“看”数据(比如图片,数字),自己总结规律,最终学会预测(比如分类图片)在深度学习中,损失函数是用来衡量模型参数的质量的函数,衡量的方式是比较网络输出和真实输出的差异。 阅读详情

相关推荐

Robocup 仿真2D 学习笔记(二) 球队代码编译和上场

环境的一些问题 最近在使用rcssserver 和 rcssmonitor时可能会遇到./configure失败的问题,可以检查一下文件夹是否有makefile文件,如果是编译后的包直接sudo make install,如果还不行,还可以源码下载编译 rcssserver: https://sourceforge.net/projects/sserver/files/rcssserver/...

markchalse的博客 6014

Grails中的Services

1.Grails支持 "依赖注入通过规约". 换句话说,你可以使用一个属性名表示的一个服务的类名,自动把他们注入到 controllers, tag libraries,等等。 class BookController { def bookService … } 在这种情况下,Spring 容器将自动注入一个基于它自己配置作用域的服务实体

唯爱双鱼的天蝎 564

同态加密与SEAL库实战:CKKS参数调优避坑指南

本文深入探讨了同态加密技术中CKKS方案的参数调优实践,重点解析了SEAL库中`poly_modulus_degree`、`coeff_modulus`和`scale`三大核心参数的配置技巧与避坑指南。通过实战案例展示了如何平衡计算深度、精度与性能,为开发者提供了一套完整的参数优化方法论,帮助避免常见的'scale out of bounds'等错误,显著提升同态加密应用的可靠性和效率。

weixin_29315569的博客 225

grails service用法

scope 默认service是单例的,可以通过scope改变: (1)prototype:每次注入到其它类中时,都新建一个service实例 (2)request:会为每次请求创建一个service (3)flash:会为当前和下一次请求创建一个service (4)flow:In web flows the service will exist for the scope of th...

金溪的博客 717

VirtualBox虚拟机上ubuntu系统安装问题记:显示画面太小、启动就异常退出等

报错:Failed to load R0 module D:/VMMR0.r0: The path is not clean of leading double slashes: ‘D:/VMMR0.r0’ (VERR_SUPLIB_PATH_NOT_CLEAN).解决方法特别简单,就是安装VIrtualBox的时候不要安装在CDE等盘根目录下。首先VirtualBox的下载安装过程是比较简单的,此处就不赘述了。然后E盘下新建个目录,安装到这个目录下就可解决。

qq_42595610的博客 2825

第零章 序 Chisel教程汇总

笔者目前西安交通大学微电子硕士在读,研究方向为数字集成电路设计与体系结构。鉴于目前RISC-V的火热程度,笔者参与了课题组的RISC-V项目,并了解、学习了颇受关注的新型硬件构建语言——Chisel,当前参与的神经网络加速器设计便是使用Chisel开发的。这是一门敏捷开发语言,据称要比传统的Verilog语言快很多。在亲身使用过后,笔者发现确实快了不少。这主要得益于Scala作为高级语言的简洁风格...

qq_34291505的博客 7万+

groovy 自动生成entity、mapper/service类代码

本文主要讲述如何通过idea 的script 插件 自动生成 entity、mapper/serivice 等一写简单类。减少低质量的工作任务,提高工作效率。 创建数据库连接 新增entity、mapper、serivce 类自动生成代码的groovy 脚本文件 下面我已 生成实体类的脚本为例,大家可以根据自己的实际情况,进行修改 主要关注点 java 类创建人基本信息 在 87~91 行 需要引入的注解。 在93~ 103 行 实体类是否要保留表名的统一前缀 175 行 实体类后缀 在第36 行

sessionsong的专栏 1263

【零基础入门unity游戏开发——unity3D篇】unity CharacterController 3D角色控制器最详细的使用介绍,并实现俯视角、第三人称角色控制(附项目源码)

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用但是我发现很多人还是不理解,都跑来私信问我,所以决定重新做一个更加详细且简单控制器,主要是实现俯视角和第三人称角色控制。添加一个胶囊体,添加Character Controller组件,记得删除Capsule Collider组件,因为Character Controller自带了碰撞,所以不需要Character Controller参数介绍。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5019

grails项目中的java类中调用service方法

最近写java多线程时需要调用service,尝试后唯一下方法可行: 以task.java里调用smsStackService内方法testSingleMt()方法为例 1).在resources.groovy内 beans = { myBean(com.crm.my.company.MyBeanImpl) { smsStackS...

weixin_34344677的博客 272

YOLOv11改进 | Conv改进篇 | 含2种改进,引入DynamicConv替换普通Conv卷积下采样和C3k2_DynamicConv替换C3k2(来自CVPR2024)

本文提出了一种基于DynamicConv动态卷积优化的YOLOv11轻量化模型改进方案。通过引入多专家机制的动态卷积模块,在增加模型参数量的同时保持较低的计算复杂度(FLOPs),有效解决了低FLOPs模型在大规模预训练中的性能瓶颈问题。文章详细介绍了动态卷积的工作原理、核心代码实现,并提供了在YOLOv11中集成DynamicConv和C3k2_GhostModule_DynamicConv模块的完整教程,包括模块添加、配置文件修改和模型训练验证过程。实验结果表明,该方案在保持高效推理速度的同时显著提升了

Ai缝合怪、助力小伙伴高效发论文 536

UDF学习(四)FLUENT UDF-DEFINE_PROFILE宏

利用DEFINE_PROFLILE可以指定以下边界或计算域信息:DEFINE_PROFILE(name,t,i)//既可以用。

weixin_44386973的博客 1805

grails service层认识

grails定义service layer的概念,是想规范应用的层次结构,阻止核心的应用逻辑嵌入到 controller里;将逻辑嵌入控制器,在传统的web框架里也是不提倡的,它的坏处这里就不说了; grails里的service应该被看作是放置大部分应用逻辑的地方。controller负责处理请求,然后重定向等工作;这样应用的逻辑就完全独立出来,可以被重用,同时降低了系...

com_a的专栏 235

6.Burp Suite 入门篇 —— Burp Scanner 漏洞扫描

Burp Scanner 既可以是独立的全自动扫描器,也可以在手动测试中当作强大的辅助手段,而且随着技术改进,Burp Scanner 能检测到的漏洞数量也在不断增加。Burp Scanner 功能只在 burpsuite 专业版和企业版中里有,本篇教程讲的是专业版的 Burp Scanner 用法。

YouTheFreedom的博客 1万+

Grails中Service层事务处理

在Grails中Service层默认就是支持事务的,事务传播级别默认是PROPAGATION_REQUIRED. 当然你也可以设置transactional = false.如果transactional 设置为true, 则在Service层如何方法内部抛出RuntimeException类型异常, 所有操作将会回滚. class UserService { boolean tra...

weixin_30455023的博客 221

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Grails Controller层

Controller层中方法写法: class TestController { def testService def index() { } def main(){//方法名称与views中test文件夹下gsp名称一致时,可直接返回页面 //如url:localhost:8080/test/main,可直接跳转到main.gsp }

cat_book_milk的博客 1693

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《The Definitive Guide to Grails》 学习笔记八 (对应第11章)

1. Service层:在企业应用中,应该提供一个抽象层,封装业务逻辑,降低MVC各 层之间的耦合度。Service层就提供了一种把应用逻辑集中化到一套 API供 controller和其它service使用的机制。封装业务逻辑到Service层的主要需求是: * 集中化业务逻辑到一套Service API; * 应用在多个Domain类上运行,复杂的业务模型难以在controller的逻...

老码农的自留地 154

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

grails 解决emoji标签存入mysql

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33860528的博客 90

Grails 单元测试中的错误

在用grails写一个对Service的单元测试的时候,test case失败了,产生的错误是: No such property: log for class: ArticleCollectionServicegroovy.lang.MissingPropertyException: No such property: log for class: ArticleCollectionSer...

sqlxx 121

Grails 开发手册

Grails 开发手册 1. 简介 1 2. 安装 Grails 1 3. 基本命令 1 4. 目录结构 2 5. Domain 2 6. Controller 5 7. Service 7 8. Filter 8 9. Plugin 10 10. 整合前端框架 JQuery EasyUI 11 11. 配置说明 11 12. 碰到的问题 14 1. 简介 Grails

mark's technic world 3516

grails 将domain的toString用法

grails 将domain的toString用法 如下图在底部添加了 在domain创建表后添加toString方法后,在Service层调用该对象并输出 SysRole 的值都是对象名,添加toString方法后将对象变成字符串。 ...

改天的博客 293

Grails引发的中文乱码问题

由写Grails过滤不良信息的Service引发的中文乱码问题 在一个Grails项目里面,我想写一个过滤不良信息的Service,而将过滤的规则放置在xml文件之中。 以下xml文件放置不良信息,包含单词、词组和句法,支持正则表达式: &lt;filter&gt;&lt;words&gt;&lt;word&gt;fuck&lt;/word&gt;&lt;word&gt;反人民&lt...

四火专栏 502

grails 3.0以上版本配置多数据源

因为工作需要,grails升级了3.0.9版本,而且需要配置多数据源。         grails 2.1的多数据源配置比较简单,但3.0以上的版本数据库配置更改到application.yml中进行配置,如何配置多数据源,百度和bing上搜索无答案(原谅我不太会翻墙用谷歌)。         这个问题找来找去,困扰了我两三天,终于解决了。虽然官方的文档中解释的比较全面了,但还是有些误差。

IT_ZGC的博客 1227
上一篇: grails Url Mapping 实现伪静态化
下一篇: Grails Service 并发处理(笔记)
欧德曼
博客等级 码龄19年 63粉丝 82原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值