小编Rob*_*ans的帖子

使用Spring JPA规范和Hibernate加入不同的元素

我正在尝试为I18N实现构建JPA规范,以便能够过滤名称.
在数据库中,我有多种语言的翻译.
问题是大多数时候只指定默认语言.
因此,当有人请求翻译非默认语言时,我希望它能够使用默认语言.

到目前为止,我能够在规格中构建它

Specification<S> specification = (root, query, cb) -> {
  Join i18n = root.join("translations", JoinType.LEFT);
  i18n.alias("i18n");
  Join i18nDefault = root.join("translations", JoinType.LEFT);
  i18nDefault.alias("i18nDefault");

  i18n.on(cb.and(cb.equal(i18n.get("itemId"), root.get("itemId")), cb.equal(i18n.get("languageId"), 1)));
  i18nDefault.on(cb.and(cb.equal(i18nDefault.get("itemId"), root.get("itemId")), cb.equal(i18nDefault.get("languageId"), 22)));

  // Clauses and return stuff
};
Run Code Online (Sandbox Code Playgroud)

但这会导致错误,这听起来像是这个解决方案的坏消息

org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause referenced two different from-clause elements
[
 select generatedAlias0 from com.something.Item as generatedAlias0 
 left join generatedAlias0.i18n as i18n with (i18n.itemId=generatedAlias0.itemId) and ( i18n.languageId=1L )
 left join generatedAlias0.i18n as i18nDefault with (i18nDefault.itemId=generatedAlias0.itemId) and ( i18nDefault.languageId=1L )
];
Run Code Online (Sandbox Code Playgroud)

所以Hibernate不允许我用不同的元素构建一个with子句(在本例中是itemId和languageId).
有什么方法可以正确地或以不同的方式实现这个?

最后,我希望Hibernate生成一个如下所示的查询(Oracle) …

java hibernate predicate spring-data-jpa

15
推荐指数
1
解决办法
2786
查看次数

Maven和Eclipse:在maven库项目中加载默认属性并在runnable Jar中使用它

我相信在stackoverflow之前已经问过这个问题.我想提一下,我尝试了与我相关的问题所带来的解决方案.最接近我的问题的是: 在JAR中加载属性文件?.
可悲的是,那里描述的解决方案对我不起作用.由于问题的年龄,我想再问一遍是要走的路.

继续描述我的问题.
所以目前我正在开发一个已经使用maven设置的库项目,并为当前的Spring AMQP项目创建了一个扩展.
这里的目标是提供一个JAR文件,该文件可以包含在另一个项目中,以支持通过消息代理进行通信的特定方式.
此时,我正在实现配置选项,以允许用户根据自己的喜好配置消息传递客户端.但是当我测试这个功能的功能时,我在可执行的JAR中使用库时遇到了问题.

在Eclipse工作区中运行它时,一切似乎都运行得很好.但是当我尝试从我的桌面运行它(作为一个可运行的JAR)时,似乎找不到任何属性文件.

只是为了快速概述上面描述的工作空间/项目设置: 工作区概述

两个项目的项目结构都反映了Maven默认的一个:

- src/main/java
    - java source files
- src/main/resources
    - resource files
- src/test/java
    - java test files
- src/test/resources
    - test resource files
Run Code Online (Sandbox Code Playgroud)

库文件在src/main/resources文件夹中包含default.properties文件,而chatclient项目包含custom.properties文件.

一旦构建了可运行的JAR文件,它就具有以下结构.

- com
- junit
- META-INF
- org
- resources
    - default.resources
    - custom.resources
Run Code Online (Sandbox Code Playgroud)

我相信资源文件不应该位于那里.但在META-INF/maven文件夹中.尝试过这样的东西之后:

  • 将META-INF文件夹添加到我的src/main/resources文件夹中并将属性文件放在那里.
  • 使用Class-Path添加MANIFEST文件:.在里面.
  • 在代码中以多种方式加载文件.

但似乎没有任何效果.我猜这是Maven相关的,并且pom.xml中的一个简单更改可以修复它.遗憾的是,我对Maven项目设置和pom相关主题的了解非常基础(这是我使用maven的第一个项目).我似乎无法找到任何文件,即使我知道它应该在那里(可能是由我引起的问题).

在我忘记提及之前.我使用这种方式加载属性文件:

Properties props = new Properties();
prop.load(<custom static class>.class.getResourceAsStream(filename));
return props;
Run Code Online (Sandbox Code Playgroud)

我的库的pom.xml看起来像:

-- Artifact stuff --
<packaging>jar</packaging>
<build>
  <plugins>
    <plugin> …
Run Code Online (Sandbox Code Playgroud)

java eclipse jar properties maven

11
推荐指数
1
解决办法
1114
查看次数

Spring Security Ouath2:Principal对象不返回扩展的UserDetails

上周,我开始扩展UserDetails类,以便能够支持自定义字段.关于这个领域的特殊之处在于它填充了一个取决于请求参数的值.我设法正确地实现了这个(所以问题不关注那个).

现在的问题是,在成功登录后,UserDetails对象被正确填充(我能够使用AuthenticationSuccessHandler看到这一点),并且客户端从OAuth2提供程序接收JWT令牌.然后,客户端通过访问"/ uaa/user"端点尝试获取有关用户的更多详细信息.这被设置为返回Principal对象.但在检查Principal对象的内容后,我被告知UserDetails对象丢失了.方法getPrincipal()仅返回用户名而不是UserDetails对象.

根据这个问题,这是登录失败的结果.AuthenticationToken(在本例中为UsernamePasswordAuthenticationToken)被AuthenticationManager拒绝.我不知道它为什么要做这样的事情.使用默认UserDetails对象的身份验证似乎工作得很好.有人可以帮我解决这个问题吗?

有关已实现类的一些细节(如上所述).有些代码因此被遗漏.

CustomUserDetails

public class CustomUserDetails extends User {

  private final Integer custom;

  public CustomUserDetails (...default params..., Integer custom) {
    super(...default params...);
    this.custom = custom;
  }
}
Run Code Online (Sandbox Code Playgroud)

CustomUserDetailsS​​ervice

@Service
public class CustomUserDetailsService implements UserDetailsService {
  @Override
  public CustomUserDetails loadUserByUsername(String username) throw UsernameNotFoundException {
    return new CustomUserDetails(...default params..., 12345);
  }
}
Run Code Online (Sandbox Code Playgroud)

组态

@Autowired
private CustomUserDetails userDetails;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  auth.userDetailsService(userDetails);
}
Run Code Online (Sandbox Code Playgroud)

用户端点

@RequestMapping(value = "/user", method = RequestMethod.GET)
@ResponseBody
public Principal …
Run Code Online (Sandbox Code Playgroud)

spring spring-security spring-security-oauth2

10
推荐指数
1
解决办法
1130
查看次数

如何设置Bamboo以使用代码?

我一直试图让Bamboo使用代码测试.我正在使用codeception来测试symfony项目中的代码.

经过一些研究,我发现了一篇关于如何使用代码设置Jenkins的文章.

一旦阅读,我发现我应该使用Ant来运行运行测试的代码命令.

问题是我真的不知道放在哪里.本文解释了新Ant任务的所有字段,但似乎没有任何效果.

有人可以帮帮我吗?

ant bamboo codeception

9
推荐指数
1
解决办法
2329
查看次数

Symfony2访问位于security.yml中的access_control参数

我正在尝试将我的security.yml中的access_control参数作为我的自定义服务中的数组.
就像获取role_hierarchy参数一样,我认为它可以使用以下代码:

$accessParameters = $this->container->getParameter('security.access_control');

不幸的是,情况并非如此.
有人可以告诉如何获取参数吗?

php security service access-control symfony

5
推荐指数
1
解决办法
2573
查看次数

使用多租户实现在单个事务期间切换数据源

我一直在努力让这个工作几天,但似乎我找不到解决方案。这就是为什么我想在这里问它。

精简版

我有一个多租户实现,它适用于 Spring Boot、Spring Data JPA 和 Hibernate。这就像一个魅力。但现在我想实现一个功能,在单个事务期间切换数据库(数据源)。例如我在我的服务类中使用类似的代码

@Autowired
private CustomRepository customRepository;

@Autorwired
private CustomTenantIdentifierResolver customResolver;

@Transactional
public Custom getCustom(String name) {

  // Set the datasource to "one";
  this.customResolver.setIdentifier("one");
  Custom result = this.customRepository.findOneByName(name);

  //If the result is null, switch datasource to default and try again
  this.customResolver.setIdentifier("default");
  result = this.customRepository.findOneByName(name);

  return result;
}
Run Code Online (Sandbox Code Playgroud)

问题是,我的数据源没有切换。它对第二个请求使用相同的源。我想我在这里做错了什么。

在单个事务期间切换数据源的正确方法是什么?

编辑 (07-06-2016)
由于我注意到切换单个事务的数据源不起作用,我将添加一个后续内容。

是否可以为单个用户请求在两个事务之间切换数据源?如果是这样,这样做的正确方法是什么?

长版

在继续之前,我想提一下,我的多租户实现基于此博客提供教程

现在,我的目标是在动态数据源(由自定义标识符选择)无法找到结果时使用默认数据源作为后备。所有这些都需要在单个用户请求中完成。它在解决方案中使用单个或多个事务注释方法没有区别。

到现在为止,我尝试了几件事,其中一个是上面描述的,另一个包括使用多个事务管理器。该实现使用一个配置文件来创建两个事务管理器 bean,每个 bean 都有不同的数据源。

@Configuration
@EnableTransactionManagement
public class TransactionConfig {

  @Autowired
  private …
Run Code Online (Sandbox Code Playgroud)

java multi-tenant spring-data spring-data-jpa

5
推荐指数
1
解决办法
1578
查看次数

Symfony2:记得我在重新打开浏览器时删除了cookie

尽管有关堆栈溢出的所有其他问题,但我无法使用所有提供的信息解决问题.
这就是为什么我决定创建一个新的.

所以我在登录表单中实现了记住我的功能,其复选框看起来像这样:

<input type="checkbox" id="form_saveCredentials" name="form[saveCredentials]">
Run Code Online (Sandbox Code Playgroud)

登录时一切都很好,cookie设置正确

cookie设置正确

通过整个浏览器会话,cookie仍然存在.
但是当我关闭浏览器并重新打开它时,cookie仍然在那里(还没有导航到我的localhost!).

当我在localhost上导航到我的网站时,cookie会根据响应标头被删除

在此输入图像描述

我不知道为什么cookie会在导航到网站时被删除.

问题可能在于remember_me功能的securtiy.yml设置

firewalls:
    somefirewall:
        form_login:
            remember_me: true
remember_me:
        key: %secret%
        lifetime: 31536000
        remember_me_parameter: 'form[saveCredentials]'
        path: /
        domain: ~
Run Code Online (Sandbox Code Playgroud)

有关如何解决这个问题的任何想法?提前致谢

php cookies symfony

3
推荐指数
1
解决办法
1287
查看次数

使用VHDL中记录的端口映射的顶级

为了能够在我的VHDL设计中支持可扩展性,我开始使用记录作为我的组件的输入和输出.目前,我正处于使用顶级架构中的端口映射将组件链接到外部的位置.问题是,记录有多个必须与不同来源链接的变量.

目前我在VHDL代码中使用的记录看起来像这样(名称已被假货替换):

TYPE some_record_input IS RECORD
    input_one   :   sfixed(3 downto -32);
    input_two   :   sfixed(3 downto -32);
    input_rst   :   std_logic;
END RECORD;

TYPE some_record_output IS RECORD
    output_one  :   std_logic_vector(15 downto 0);
    output_dn   :   std_logic;
END RECORD;
Run Code Online (Sandbox Code Playgroud)

因此我正在使用fixed_pkg库来获取固定点.
这些记录在实体端口映射中使用如下.

ENTITY my_component IS
port
(
    clk     :   IN  std_logic;
    data    :   IN  some_record_input;
    result  :   OUT some_record_output
);
END my_component;
Run Code Online (Sandbox Code Playgroud)

现在问题发生的部分.我在顶层使用这个组件将它与我的Altera Board可用的按钮和LED连接起来.这是通过在我的顶级实体的主体中使用端口映射来完成的:

A0 : my_component PORT MAP(clk => CLK, data => (input_one => IONE, input_two => ITWO, input_rst => RST), result => (output_one …
Run Code Online (Sandbox Code Playgroud)

components record vhdl toplevel

3
推荐指数
1
解决办法
3894
查看次数

Spring Security:如何将重定向查询参数添加到登录URL以允许页面加书签?

问题场景

我目前正在处理我的应用程序的登录页面,该页面基于Spring启动和相关的Spring项目(如安全性和云).我希望我的应用程序的用户为登录页面添加书签,因此需要采取这种行为.当我开始考虑潜在的问题时,我认为在您为页面添加书签后,应用程序将无法知道重定向到哪里(因为这可能是多个URL)(因为只有/ login且没有重定向,所以).通常,用户不会,例如,/ dashboard被重定向到登录,因为没有身份验证.在使用呈现他或她的凭证之后,应用程序重定向用户.但这只是可能的原因,应用程序在当前会话中保存SavedRequest,告知重定向位置.

我想要实现的目标

基本上我想要实现的是应用程序在用户在/ login url上设置书签后知道去哪里.这里理想的情况是/ login url包含重定向参数.例如.

  1. 用户访问/仪表板?param =值
  2. 没有身份验证,应用程序重定向到/ login?redirect =/dashboard?param = value
  3. 用户登录
  4. 应用程序将用户发送到/ dashboard?param = value.

现在,如果用户将对在步骤2中提供的URL添加书签,则在一段时间之后单击书签时,将向应用程序提供足够的信息以进行合理的重定向.

如果有人知道更好的方法,我想听听.

迄今采取的步骤

到目前为止,我的搜索基于StackOverflow上的另一个答案.这似乎是朝着正确方向迈出的一步,但仍然缺少一些所需的功能.

我首先创建了LoginUrlAuthenticationEntryPoint类的Custom实现.它会覆盖begin方法,如下所示:

public class CustomLoginUrlAuthenticaitonEntryPoint extends LoginUrlAuthenticationEntryPoint 
{
  @Override
  public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException 
  {
    if (!request.getRequestURI().equals(this.getLoginFormUrl())) 
    {
      RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
      redirectStrategy.sendRedirect(request, response, getLoginFormUrl() + "?redirect=" + request.getRequestURI() + "?" + request.getQueryString());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我将此自定义类添加到HttpSecurity作为默认身份验证入口点.

@Configuration
@Order(-20)
public class SecurityConfig extends WebSecurityConfigurerAdapter …
Run Code Online (Sandbox Code Playgroud)

java redirect spring spring-security

3
推荐指数
1
解决办法
8365
查看次数