我正在从CodeIgniter切换到Symfony 2.有人可以给我一个如何:
我正在阅读Pro Spring 3一书.它有一段让我很困惑的段落.这一段是关于春天的自动装配.这是一段摘录:
在大多数情况下,关于是否应该使用自动装配问题的答案绝对是"不!"自动装配可以节省您在小型应用程序中的时间,但在许多情况下,它会导致不良做法,并且在大型应用程序中不灵活.使用byName似乎是一个好主意,但它可能会导致您为类提供人工属性名称,以便您可以利用自动装配功能.Spring背后的整个想法是,你可以创建你喜欢的类,让Spring为你工作,而不是相反...
...对于任何重要的应用,不惜一切代价避免自动装配.
我一直在我创建的应用程序中使用@Autowired标记.有人可以解释它有什么问题以及我应该使用什么?
关于我如何处理大多数事情的一个小例子是:
@Service("snippetService")
public class SnippetService {
@Autowired
private TestService testService;
public Snippet getSnippet() {
return testService.getSnippet();
}
}
Run Code Online (Sandbox Code Playgroud)
使用像这样"错误"的自动装配还是我错过了什么?
我有一个bean,它有很多用JSR-303验证注释注释的字段.现在有一个新要求,其中一个字段是强制性的,但仅限于某些条件.
我环顾四周,找到了我需要的东西,验证组.
这就是我现在拥有的:
public interface ValidatedOnCreationOnly {
}
@NotNull(groups = ValidatedOnCreationOnly.class)
private String employerId;
@Length(max = 255)
@NotNull
private String firstName;
@Length(max = 255)
@NotNull
private String lastName;
Run Code Online (Sandbox Code Playgroud)
但是,当我在单元测试中运行此验证时:
@Test
public void testEmployerIdCanOnlyBeSetWhenCreating() {
EmployeeDTO dto = new EmployeeDTO();
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Set<ConstraintViolation<EmployeeDTO>> violations = vf.getValidator().validate(dto, EmployeeDTO.ValidatedOnCreationOnly.class);
assertEquals(violations.size(), 3);
}
Run Code Online (Sandbox Code Playgroud)
事实证明,所有非组注释验证都被忽略,我只得到1次违规.
我可以理解这种行为,但我想知道是否有一种方法可以使该组包含所有非注释参数.如果不是,我必须做这样的事情:
public interface AlwaysValidated {
}
public interface ValidatedOnCreationOnly extends AlwaysValidated {
}
@NotNull(groups = ValidatedOnCreationOnly.class)
private String employerId;
@Length(max = 255, groups = AlwaysValidated.class)
@NotNull(groups = AlwaysValidated.class) …Run Code Online (Sandbox Code Playgroud) 我在我正在研究的项目中使用reactjs和flux体系结构.我对如何将嵌套数据正确地分解到商店以及为什么我应该将数据分成多个商店感到困惑.
为了解释这个问题,我将使用这个例子:
想象一下你有项目的Todo应用程序.每个项目都有任务,每个任务都有笔记.
该应用程序使用REST API检索数据,返回以下响应:
{
projects: [
{
id: 1,
name: "Action Required",
tasks: [
{
id: 1,
name: "Go grocery shopping",
notes: [
{
id: 1,
name: "Check shop 1"
},
{
id: 2,
name: "Also check shop 2"
}
]
}
]
},
]
}
Run Code Online (Sandbox Code Playgroud)
虚拟应用程序的界面在左侧显示项目列表,当您选择项目时,该项目将变为活动状态,其任务将显示在右侧.单击任务时,您可以在弹出窗口中查看其注释.
我要做的是使用1个单独的商店,即"Project Store".操作会向服务器发出请求,获取数据并指示商店使用新数据填充自己.商店在内部保存这个实体树(项目 - >任务 - >注释).
为了能够根据选择的项目显示和隐藏任务,我还在商店中保留一个变量"activeProjectId".基于此视图可以获取活动项目,其任务并呈现它们.
问题解决了.
但是:在网上搜索一下以确定这是一个很好的解决方案后,我看到很多人都说你应该为每个实体使用一个单独的商店.
这意味着:ProjectStore,TaskStore和NoteStore.为了能够管理关联,我可能还需要一个"TasksByProjectStore"和一个"NotesByTaskStore".
有人可以解释为什么这会更好吗?我唯一看到的是管理商店和数据流的大量开销.
我是spring框架的新手,并且使用Spring Context对其依赖注入功能有疑问.
这是我正在尝试编写集成测试的类:
public class UserService {
private Validator validator;
private UserRepository userRepository;
private Encryptor encryptor;
private MailService mailService;
...
public void registerUser(User user) {
user.setPassword(encryptor.encrypt(user.getPassword()));
Errors errors = new BindException(user, "user");
validator.validate(user, errors);
if (errors.getErrorCount() == 0) {
userRepository.addUser(user);
mailService.sendMail(user.getEmail());
}
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中(使用Mockito)我想确保调用这四个项目,所以我创建了如下测试:
public void testRegisterCallsValidateInValidator() {
userService.registerUser(testUser);
verify(userService.getValidator(), times(1)).validate(any(User.class), any(Errors.class));
}
Run Code Online (Sandbox Code Playgroud)
然而,所有测试都失败了,说我多次调用该方法.我唯一的猜测是UserService bean在所有测试开始时创建一次,但在每次测试后都不会重新加载.
在我的测试配置中,我使用以下xml来决定要注入的bean:
<bean id="userService" class="be.kdg.coportio.services.UserService">
<property name="validator" ref="validator"/>
<property name="userRepository" ref="userRepository"/>
<property name="encryptor" ref="encryptor"/>
<property name="mailService" ref="mailService"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我们正在开发一个带有jQuery mobile的移动应用程序,并且想要在spring 3.1.x后端以编程方式对用户进行身份验证,并使用spring security进行正确设置.
POST请求被发送到包含用户名和密码的后端(使用jQuery的$ .post),然后服务器验证凭据是否正确并登录用户.
服务器似乎在SecurityContext中正确设置了身份验证,但是当我们向服务器发出第二个请求($ .get到需要登录的页面)时,安全细节似乎不会被记住,并且匿名令牌似乎是在上下文中.
这是控制器中处理登录的方法(为简洁起见,删除了密码检查):
@RequestMapping(value = "/login", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public Map<String, String> login(@RequestParam String username, @RequestParam String password, HttpServletRequest request) {
Map<String, String> response = new HashMap<String, String>();
User u = userService.findByAccountName(username);
if (u != null && u.hasRole("inspector")) {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
try {
Authentication auth = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(auth);
response.put("status", "true");
return response;
} catch (BadCredentialsException ex) {
response.put("status", "false");
response.put("error", "Bad credentials");
return response;
}
} …Run Code Online (Sandbox Code Playgroud) 我正在从学说1.2转换到2.x并遇到一个奇怪的问题.
我有一个实体CompositionRule,它有一个属性$ buildingBlock,指向一个BuildingBlock实体.
我设置了这个属性,使它指向一个现有的BuildingBlock,我从数据库中获取它.
当我持久化主对象(CompositionRule)时,entitymanager尝试创建一个新的BuildingBlock项并将其插入数据库,而不是仅仅接受它已存在并忽略它.
当你执行$ entity-> save()时,我不会在教义1.2中看到我在这里缺少的东西.所有底层对象都得到了正确处理.
以下是我的映射/代码的一些部分:
CompositionRule:
<many-to-one field="buildingBlock" target-entity="BuildingBlock">
<cascade><cascade-all /></cascade>
</many-to-one>
..
public function setBuildingBlock($buildingBlock) {
$buildingBlock->addCompositionRule($this);
$this->buildingBlock = $buildingBlock;
}
Run Code Online (Sandbox Code Playgroud)
BuildingBlock
<one-to-many field="compositionRules" target-entity="CompositionRule" mapped-by="buildingBlock">
<cascade>
<cascade-all />
</cascade>
</one-to-many>
public function addCompositionRule($rule) {
$this->compositionRules->add($rule);
}
Run Code Online (Sandbox Code Playgroud) 我正在设计一个RESTful API,我正在试图弄清楚如何显示和更新资源的外键.
让我有一个对象User,它有一个id,name和一个外键(多对一关系)到实体:Computer.
我在大多数在线示例中看到的内容:
GET/users/1
{
id: 1,
name: "Bob",
computer: "<url>/computers/5"
}
Run Code Online (Sandbox Code Playgroud)
我可以理解,它是另一个资源的链接.但是当你想为鲍勃选择另一台电脑时,你会怎么做?
PUT/users/1
{
name: "Bob",
computer: "<url>/computers/4"
}
Run Code Online (Sandbox Code Playgroud)
这感觉很奇怪.我也在考虑以下情况:假设必须实现API的人可以使用下拉列表为Bob选择计算机,并且应该选择当前的计算机,我需要id来执行此操作.我是否必须自己解析网址来切断身份证?
我不应该这样做是有原因的:
GET/users/1
{
id: 1,
name: "Bob",
computerId: 5
}
Run Code Online (Sandbox Code Playgroud)
PUT/users/1
{
name: "Bob",
computerId: 4
}
Run Code Online (Sandbox Code Playgroud) 我在网页上使用Syntaxhighlighter,我使用了一个javascript函数来使用SyntaxHighlighter.autoloader(...)加载所有画笔并应用SyntaxHighlighter.all()
我在页面加载时运行此函数,结果:语法高亮显示正确应用.
之后,我使用ajax加载一些新内容并运行相同的功能以突出显示新内容.
然而这次Syntaxhighlighter似乎已经忘记了所有加载的画笔,我得到一个警告说没有加载画笔.
我不知道是什么导致这个,虽然我环顾四周,发现了两个可能的原因:
这看起来像解决方案但是当我从存储库使用解压缩的shCore.js时,我的IDE指示语法错误,并且当我尝试运行它时我得到javascript错误.
我在其他类似Stack Overflow帖子的几个答案中找到的另一个解决方案是在加载页面后使用SyntaxHighlighter.highlight()而不是.all().但这不起作用.
我正在使用的功能:
function loadSyntaxHighLighter() {
SyntaxHighlighter.autoloader(
'ahk ' + app.assets + 'js/syntaxhighlighter/brushes/shBrushAhk.js',
'aps ' + app.assets + 'js/syntaxhighlighter/brushes/shBrushAppleScript.js'
//...
);
SyntaxHighlighter.defaults['toolbar'] = false;
if (SyntaxHighlighter != 'undefined') {
SyntaxHighlighter.highlight();
} else {
SyntaxHighlighter.all();
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道如何解决这个问题?(或者有人可以指出我如何在bitbucket上建议更改)
谢谢
我正在尝试让 XDebug 在我的本地 wamp 安装(Uniform Server 8)上运行。
但是当我输入
xdebug.remote_enable=1时
在我的 php.ini 中,这是我的 IDE 使用 xdebug 所必需的,加载页面变得非常慢,每页慢 5 秒。不过调试器可以工作。
我以前没有使用过 xdebug,但我可以想象它通常不应该花这么长时间。我很确定这可能与使用 symfony2 框架有关。
有谁知道是什么原因造成的?
java ×4
spring ×4
javascript ×2
php ×2
symfony ×2
apache ×1
base-url ×1
doctrine ×1
flux ×1
mobile ×1
reactjs ×1
reactjs-flux ×1
rest ×1
unit-testing ×1
url ×1
validation ×1
xdebug ×1