title: Spring: Returning empty HTTP Responses with ResponseEntity<Void> doesn't work
body: <p>We are implementing a REST API with Spring (4.1.1.). For certain HTTP requests, we would like to return a head with no body as a response. However, using <code>ResponseEntity&lt;Void&gt;</code> doesn't seem to work. When called with a <code>MockMvc</code> test, a 406 (Not acceptable) is returned. Using <code>ResponseEntity&lt;String&gt;</code> without a parameter value (<code>new  ResponseEntity&lt;String&gt;( HttpStatus.NOT_FOUND )</code>) works fine. </p>
  
  <p>Method:</p>
  
  <pre><code>@RequestMapping( method = RequestMethod.HEAD, value = Constants.KEY )
  public ResponseEntity&lt;Void&gt; taxonomyPackageExists( @PathVariable final String key ) {
  
      LOG.debug( "taxonomyPackageExists queried with key: {0}", key ); //$NON-NLS-1$
  
      final TaxonomyKey taxonomyKey = TaxonomyKey.fromString( key );
  
      LOG.debug( "Taxonomy key created: {0}", taxonomyKey ); //$NON-NLS-1$
  
      if ( this.xbrlInstanceValidator.taxonomyPackageExists( taxonomyKey ) ) {
  
          LOG.debug( "Taxonomy package with key: {0} exists.", taxonomyKey ); //$NON-NLS-1$
  
          return new ResponseEntity&lt;Void&gt;( HttpStatus.OK );
  
      } else {
  
          LOG.debug( "Taxonomy package with key: {0} does NOT exist.", taxonomyKey ); //$NON-NLS-1$
  
          return new ResponseEntity&lt;Void&gt;( HttpStatus.NOT_FOUND );
      }
  
  }
  </code></pre>
  
  <p>Test case (TestNG):</p>
  
  <pre><code>public class TaxonomyQueryControllerTest {
  
  private XbrlInstanceValidator   xbrlInstanceValidatorMock;
  private TaxonomyQueryController underTest;
  private MockMvc                 mockMvc;
  
  @BeforeMethod
  public void setUp() {
      this.xbrlInstanceValidatorMock = createMock( XbrlInstanceValidator.class );
      this.underTest = new TaxonomyQueryController( this.xbrlInstanceValidatorMock );
      this.mockMvc = MockMvcBuilders.standaloneSetup( this.underTest ).build();
  }
  
  @Test
  public void taxonomyPackageDoesNotExist() throws Exception {
      // record
      expect( this.xbrlInstanceValidatorMock.taxonomyPackageExists( anyObject( TaxonomyKey.class ) ) ).andStubReturn(
              false );
  
      // replay
      replay( this.xbrlInstanceValidatorMock );
  
      // do the test
      final String taxonomyKey = RestDataFixture.taxonomyKeyString;
  
      this.mockMvc.perform( head( "/taxonomypackages/{key}", taxonomyKey ).accept( //$NON-NLS-1$
              MediaType.APPLICATION_XML ) ).andExpect( status().isNotFound() );
  
  }
  
  }
  </code></pre>
  
  <p>Fails with this stack trace: </p>
  
  <pre><code>FAILED: taxonomyPackageDoesNotExist
  java.lang.AssertionError: Status expected:&lt;404&gt; but was:&lt;406&gt;
  at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:60)
  at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:89)
  at org.springframework.test.web.servlet.result.StatusResultMatchers$10.match(StatusResultMatchers.java:652)
  at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:153)
  at de.zeb.control.application.xbrlstandalonevalidator.restservice.TaxonomyQueryControllerTest.taxonomyPackageDoesNotExist(TaxonomyQueryControllerTest.java:54)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)
  at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)
  at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)
  at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)
  at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)
  at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)
  at org.testng.TestRunner.privateRun(TestRunner.java:767)
  at org.testng.TestRunner.run(TestRunner.java:617)
  at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)
  at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)
  at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)
  at org.testng.SuiteRunner.run(SuiteRunner.java:240)
  at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
  at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
  at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)
  at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)
  at org.testng.TestNG.run(TestNG.java:1057)
  at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)
  at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)
  at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)
  </code></pre>