很长一段时间,我试图弄清楚应该在Spring MVC应用程序中进行用户输入的验证.在许多在线博客和教程中,我基本上读到控制器应验证用户输入,如果无效,则通过显示包含错误消息的页面来响应用户.然而,我目前对Spring和Spring MVC分层系统的理解是,Controller是应用程序逻辑(服务层)和"Web世界"之间唯一的浅层接口,允许从Web使用服务层.另外,据我所知,Spring MVC仅提供合理的Controller验证工具.
如果现在验证发生在Controller中,如果稍后我想解开"web world"中的应用程序逻辑,则必须在新环境中重新实现验证逻辑(例如使用Swing的桌面应用程序).在我看来,决定哪些操作在域对象上"有效"以及这些对象可能具有哪些"有效"状态的能力是服务层的核心部分,而不是应用程序的其他部分的关注(例如控制器).
在这种情况下,为什么将输入验证逻辑放在控制器层而不是服务层是"良好实践"?
我有一个问题,使用spring框架的MapSqlParameterSource将null值传递给NamedParameterJdbcTemplate.谁知道怎么做?
目前我的代码是:
String sql = "update person set project = :project where id = :id;";
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("project ", null);
params.addValue("id ", 1);
int count = newNamedParameterJDBCTemplate().update(sql, params);
Run Code Online (Sandbox Code Playgroud)
这是我得到NullPointerException的地方.
我有一个Java应用程序,它有工作线程来处理作业.一个worker产生一个结果对象,比如说:
class WorkerResult{
private final Set<ResultItems> items;
public Worker(Set<ResultItems> pItems){
items = pItems;
}
}
Run Code Online (Sandbox Code Playgroud)
当工人完成时,它执行此操作:
...
final Set<ResultItems> items = new SomeNonThreadSafeSetImplSet<ResultItems>();
for(Item producedItem : ...){
items.add(item);
}
passToGatherThread(items);
Run Code Online (Sandbox Code Playgroud)
这套items装置在这里是一种"工作单元".该passToGatherThread方法将items集合传递给一个收集线程,其中只有一个在运行时存在.
这里不需要同步,因为竞争条件不会发生,因为只有一个线程(Gather-thread)读取该items集合.AFAICS,Gather-thread可能看不到所有项目,因为该集合不是线程安全的,对吧?
假设我无法进行passToGatherThread同步,因为它是第三方库.我基本上担心的是收集线程由于缓存,VM优化等而没有看到所有项目.所以这里出现了一个问题:如何以线程安全的方式传递项目集,以便Gather线程"看到"适当的项目?
我想使用ZeroMQ(java绑定,jzmq)将客户端连接到服务器,但我需要严重的TCP信息,例如客户端请求的TCP/IP地址!问题是,为了能够在网络中宣布服务,我需要获取请求的TCP地址,以便能够将客户端重定向到该服务.在这种情况下,经纪人是一个中央"服务注册机构".但是,双方都有ZeroMQ服务,我没有看到检索该信息的选项.
我现在所做的是使用标准套接字建立到代理的虚拟连接,在建立连接后,我获取用于此连接的IP地址并再次关闭连接.已检索到的IP地址现在用于在随机端口上使用ZeroMQ套接字绑定它.
我认为这个解决方案是有史以来最丑陋的解决方案,因此:对这个问题有什么更好的解决方案?
问候.
我有这个控制器方法的Spring MVC应用程序.
@RequestMapping(value = "/add", method = RequestMethod.POST)
public String addNumber(@RequestParam(value="number", required=false) Long number) {
...
return "redirect:/showAll/";
}
Run Code Online (Sandbox Code Playgroud)
在我的JSP中,我有一个标准的HTML表单,它将一个名为"number"的值发布到上面的控制器方法中.但是,如果我省略了值(不在文本字段中输入任何内容)并将数据POST到控制器,则在调用控制器方法之前,我的浏览器显示
HTTP Status 400 - Required Long parameter 'number' is not present
Run Code Online (Sandbox Code Playgroud)
尽管控制器方法注解明确规定-parameter为"数字" 不必需的.
有没有人对可能发生的事情略有了解?
谢谢.
PS:抛出的异常如下:
org.springframework.web.bind.MissingServletRequestParameterException: Required Long parameter 'number' is not present
Run Code Online (Sandbox Code Playgroud)
编辑:这是一个Spring 3.2.3.RELEASE错误(见这里).使用版本3.1.4.RELEASE我不再有这个问题了.
在使用Spring MVC验证器执行"浅"用户输入验证后,是否有一些使用Spring MVC呈现服务层验证错误的良好实践?例如,拥有以下代码:
@Autowired
private UserService userService;
@RequestMapping(value = "user/new", method = RequestMethod.POST)
public String createNewUser(@ModelAttribute("userForm") UserForm userForm, BindingResult result, Model model){
UserFormValidator validator = new UserFormValidator(); //extending org.springframework.validation.Validator
validator.validate(userForm, result);
if(result.hasErrors()){
model.addAttribute("userForm", userForm);
return "user/new";
}
// here, for example, the user already might exist
userService.createUser(userForm.getName(), userForm.getPassword());
return "redirect:user/home";
}
Run Code Online (Sandbox Code Playgroud)
虽然将此代码作为示例似乎微不足道,但在服务层验证是一项复杂的任务时,对我来说似乎是一个微妙的故事.尽管是一个荒谬的场景,UserService可能会创建一个用户列表,如果其中一个已经存在,那么必须以某种方式通知视图层哪些用户无效(例如已经存在).
我正在寻找一个如何设计一段代码的良好实践,这使得它成为可能
1)处理具有复杂数据作为输入的服务层的验证错误,和
2)向用户呈现这些验证错误
尽可能简单.有什么建议?
我想知道为什么第一种阶乘方法在红宝石中不起作用(无限循环)而第二种方法起作用.
def fac (x)
if x == 0
return 1
else
return (fac (x-1) * x)
end
end
def fact( num )
return 1 if num == 0
fact(num - 1) * num
end
Run Code Online (Sandbox Code Playgroud) 我目前正在使用C#编写Outlook 2010 AddIn.我想要的是从我从AppointmentItem拉出的Recipient对象中获取CompanyName属性.因此,拥有AppointmentItem的收件人我想找出每个收件人的CompanyName,它可能是一个ExchangeUser.
我的代码是这样的:
Recipients recipients = appointmentItem.Recipients;
foreach (Recipient rec in recipients)
{
resolved = rec.Resolve();
if (resolved)
{
ContactItem contactItem = rec.AddressEntry.GetContact();
String companyName = contactItem.CompanyName;
// ...
}
Run Code Online (Sandbox Code Playgroud)
其中contactItem始终为null.
做这样的事也会导致空指针.
ExchangeUser u = rec.AddressEntry.GetExchangeUser();
companyName = u.CompanyName;
Run Code Online (Sandbox Code Playgroud)
我根本无法获取CompanyName信息.我知道这些信息确实存在.但是,除了CompanyName之外,还有许多其他属性似乎也会产生NULL指针.
有人可以给我一个暗示吗?
提前致谢.
我试图让我的spring + hibernate + spring-security和tiles2 - "HelloWorld"应用程序工作,遵循本指南(不幸的是它在德语).
我的问题是登录我的应用程序时收到"404"错误消息.重定向到登录页面按预期工作,但是当我点击登录按钮时,我无法访问" http:// localhost:8080/App/j_spring_security_check ".
我的web.xml看起来像这样:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/defs/applicationContext.xml
/WEB-INF/defs/applicationContext-security.xml
</param-value>
</context-param>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
和applicationContext-security.xml文件看起来这样......
<http use-expressions="true">
<intercept-url pattern="/index.html" access="permitAll" />
<intercept-url pattern="/timeout.html" access="permitAll" />
<intercept-url pattern="/redirect.html" access="permitAll" />
<intercept-url pattern="/media/**" access="permitAll" />
<intercept-url pattern="/includes/**" access="permitAll" />
<intercept-url pattern="/office/**" access="hasRole('ROLE_USER')" />
<intercept-url pattern="/office/admin/**" access="hasRole('ROLE_ADMIN')" />
<form-login login-page="/index.html"
authentication-failure-url="/index.html?login_error=1"
default-target-url='/office/kunden.html'
always-use-default-target='true'
/>
<logout logout-success-url="/index.html" />
<remember-me />
<session-management invalid-session-url="/index.html">
<concurrency-control max-sessions="2" error-if-maximum-exceeded="true" /> …Run Code Online (Sandbox Code Playgroud) spring ×5
java ×4
spring-mvc ×3
validation ×2
zeromq ×2
add-in ×1
c# ×1
jdbc ×1
jdbctemplate ×1
jzmq ×1
outlook ×1
recursion ×1
ruby ×1
sockets ×1